encoding/json: improve performance of Unmarshal on primitive types
Skip most of the scanning and parsing logic for simple (non-object/array) JSON values.
benchmark old ns/op new ns/op delta
BenchmarkUnmarshalInt 948 436 -54.01%
BenchmarkUnmarshalUint 930 427 -54.09%
BenchmarkUnmarshalString 1407 715 -49.18%
BenchmarkUnmarshalFloat 1114 536 -51.89%
BenchmarkUnmarshalBool 759 266 -64.95%
BenchmarkUnmarshalStruct 8165 8181 +0.20%
No significant effects on the go1 benchmarks:
benchmark old ns/op new ns/op delta
BenchmarkBinaryTree17
9647362752 9596196417 -0.53%
BenchmarkFannkuch11
5623613048 5518694872 -1.87%
BenchmarkGobDecode
32944041 33165434 +0.67%
BenchmarkGobEncode
21237482 21080554 -0.74%
BenchmarkGzip
750955920 749861980 -0.15%
BenchmarkGunzip
197369742 197886192 +0.26%
BenchmarkJSONEncode
79274091 78891137 -0.48%
BenchmarkJSONDecode
180257802 175280358 -2.76%
BenchmarkMandelbrot200
7396666 7388266 -0.11%
BenchmarkParse
11446460 11386550 -0.52%
BenchmarkRevcomp
1605152523 1599512029 -0.35%
BenchmarkTemplate
204538247 207765574 +1.58%
benchmark old MB/s new MB/s speedup
BenchmarkGobDecode 23.30 23.14 0.99x
BenchmarkGobEncode 36.14 36.41 1.01x
BenchmarkGzip 25.84 25.88 1.00x
BenchmarkGunzip 98.32 98.06 1.00x
BenchmarkJSONEncode 24.48 24.60 1.00x
BenchmarkJSONDecode 10.76 11.07 1.03x
BenchmarkParse 5.06 5.09 1.01x
BenchmarkRevcomp 158.34 158.90 1.00x
BenchmarkTemplate 9.49 9.34 0.98x
Fixes #3949.
R=golang-dev, dave, bradfitz, timo
CC=golang-dev
https://golang.org/cl/
7068043