From df68afd07ce67727bcc2ad8e4afaa42dbcbf58e7 Mon Sep 17 00:00:00 2001 From: "Pascal S. de Kloe" Date: Wed, 16 Nov 2016 16:35:42 +0100 Subject: encoding/json: reduce unmarshal mallocs for unmapped fields JSON decoding performs poorly for unmapped and ignored fields. We noticed better performance when unmarshalling unused fields. The loss comes mostly from calls to scanner.error as described at #17914. benchmark old ns/op new ns/op delta BenchmarkIssue10335-8 431 408 -5.34% BenchmarkUnmapped-8 1744 1314 -24.66% benchmark old allocs new allocs delta BenchmarkIssue10335-8 4 3 -25.00% BenchmarkUnmapped-8 18 4 -77.78% benchmark old bytes new bytes delta BenchmarkIssue10335-8 320 312 -2.50% BenchmarkUnmapped-8 568 344 -39.44% Fixes #17914, improves #10335 Change-Id: I7d4258a94eb287c0fe49e7334795209b90434cd0 Reviewed-on: https://go-review.googlesource.com/33276 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/encoding/json/bench_test.go | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/encoding/json/bench_test.go') diff --git a/src/encoding/json/bench_test.go b/src/encoding/json/bench_test.go index cd7380b1ef..ec5a88a4e2 100644 --- a/src/encoding/json/bench_test.go +++ b/src/encoding/json/bench_test.go @@ -221,3 +221,14 @@ func BenchmarkIssue10335(b *testing.B) { } } } + +func BenchmarkUnmapped(b *testing.B) { + b.ReportAllocs() + var s struct{} + j := []byte(`{"s": "hello", "y": 2, "o": {"x": 0}, "a": [1, 99, {"x": 1}]}`) + for n := 0; n < b.N; n++ { + if err := Unmarshal(j, &s); err != nil { + b.Fatal(err) + } + } +} -- cgit v1.3-5-g9baa