go
go copied to clipboard
[update] read string memory allocation optimization
before optimization benchmark test:
BenchmarkDecodeJsoniterStructMedium-4 195046 6399 ns/op 384 B/op 41 allocs/op test by: https://github.com/json-iterator/go-benchmark/blob/master/src/github.com/json-iterator/go-benchmark/benchmark_medium_payload_test.go
after optimization benchmark test:
BenchmarkDecodeJsoniterStructMedium-4 219428 4998 ns/op 32 B/op 2 allocs/op test by: https://github.com/json-iterator/go-benchmark/blob/master/src/github.com/json-iterator/go-benchmark/benchmark_medium_payload_test.go
There will be a rare case to consider here: what if the input bytes will further get mutated?
In this case, the output string will be changed since they shared the same underlying memory address.
import (
"fmt"
jsoniter "github.com/json-iterator/go"
)
func main() {
var i1 = []byte(`"a"`)
var i2 = []byte(`"b"`)
var s1 string
var s2 string
jsoniter.Unmarshal(i1, &s1)
jsoniter.Unmarshal(i2, &s2)
i1[1] = 98
fmt.Println(s1, s2) // expect a b, got b b
}