Skip to content
This repository was archived by the owner on Dec 15, 2025. It is now read-only.

[update] read string memory allocation optimization - #650

Open
ddzrc wants to merge 1 commit into
json-iterator:masterfrom
ddzrc:ddzrc-update-readstring-memory-optimization
Open

ddzrc wants to merge 1 commit into
json-iterator:masterfrom
ddzrc:ddzrc-update-readstring-memory-optimization

Conversation

@ddzrc

@ddzrc ddzrc commented Dec 8, 2022

Copy link
Copy Markdown

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

@kz-sher

kz-sher commented Mar 15, 2023

Copy link
Copy Markdown

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
}
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

2 participants