go icon indicating copy to clipboard operation
go copied to clipboard

[update] read string memory allocation optimization

Open ddzrc opened this issue 2 years ago • 1 comments

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

ddzrc avatar Dec 08 '22 09:12 ddzrc

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
}

kz-sher avatar Mar 15 '23 09:03 kz-sher