diff options
| author | korzhao <korzhao95@gmail.com> | 2023-08-02 17:39:09 +0800 |
|---|---|---|
| committer | Daniel Martà <mvdan@mvdan.cc> | 2023-08-25 08:50:07 +0000 |
| commit | 4c5dac72029bb3dd4559a2fafe566bed71f22c42 (patch) | |
| tree | 91e1df369327502a2d231159bb66f2fa8a6a843d /src/encoding/json/bench_test.go | |
| parent | dd38ade8d1f2cbe938604fbb34a69533cb128310 (diff) | |
| download | go-4c5dac72029bb3dd4559a2fafe566bed71f22c42.tar.xz | |
encoding/json: optimize Marshal for maps
Optimize marshaling of maps by using slices.SortFunc.
This drops an unnecessary field from reflectWithString,
which also reduces the cost of each swap operation.
benchmark old ns/op new ns/op delta
BenchmarkMarshalMap-10 228 139 -39.24%
benchmark old allocs new allocs delta
BenchmarkMarshalMap-10 11 8 -27.27%
benchmark old bytes new bytes delta
BenchmarkMarshalMap-10 432 232 -46.30%
Change-Id: Ic2ba7a1590863c7536305c6f6536372b26ec9b0c
Reviewed-on: https://go-review.googlesource.com/c/go/+/515176
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Daniel Martà <mvdan@mvdan.cc>
Reviewed-by: Joseph Tsai <joetsai@digital-static.net>
Reviewed-by: qiulaidongfeng <2645477756@qq.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Diffstat (limited to 'src/encoding/json/bench_test.go')
| -rw-r--r-- | src/encoding/json/bench_test.go | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/encoding/json/bench_test.go b/src/encoding/json/bench_test.go index b7e2b6974a..0f080acdbf 100644 --- a/src/encoding/json/bench_test.go +++ b/src/encoding/json/bench_test.go @@ -246,6 +246,22 @@ func BenchmarkMarshalBytesError(b *testing.B) { b.Run("4096", benchMarshalBytesError(4096)) } +func BenchmarkMarshalMap(b *testing.B) { + b.ReportAllocs() + m := map[string]int{ + "key3": 3, + "key2": 2, + "key1": 1, + } + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + if _, err := Marshal(m); err != nil { + b.Fatal("Marshal:", err) + } + } + }) +} + func BenchmarkCodeDecoder(b *testing.B) { b.ReportAllocs() if codeJSON == nil { |
