]> Cypherpunks repositories - gostls13.git/commit
encoding/json: use sync.Map for field cache
authorJoe Tsai <joetsai@digital-static.net>
Fri, 10 Nov 2017 01:33:12 +0000 (17:33 -0800)
committerJoe Tsai <thebrokentoaster@gmail.com>
Sat, 3 Mar 2018 00:08:09 +0000 (00:08 +0000)
commitf0756ca2ea3a0dbd6c6479eacffd0023416280cb
treee2c54637ebf6857ec30240aaa6f3b8d88406d94a
parente658b85f26f1de6f49578b7dac95eee0da880ab9
encoding/json: use sync.Map for field cache

The previous type cache is quadratic in time in the situation where
new types are continually encountered. Now that it is possible to dynamically
create new types with the reflect package, this can cause json to
perform very poorly.

Switch to sync.Map which does well when the cache has hit steady state,
but also handles occasional updates in better than quadratic time.

benchmark                                     old ns/op      new ns/op     delta
BenchmarkTypeFieldsCache/MissTypes1-8         14817          16202         +9.35%
BenchmarkTypeFieldsCache/MissTypes10-8        70926          69144         -2.51%
BenchmarkTypeFieldsCache/MissTypes100-8       976467         208973        -78.60%
BenchmarkTypeFieldsCache/MissTypes1000-8      79520162       1750371       -97.80%
BenchmarkTypeFieldsCache/MissTypes10000-8     6873625837     16847806      -99.75%
BenchmarkTypeFieldsCache/HitTypes1000-8       7.51           8.80          +17.18%
BenchmarkTypeFieldsCache/HitTypes10000-8      7.58           8.68          +14.51%

The old implementation takes 12 minutes just to build a cache of size 1e5
due to the quadratic behavior. I did not bother benchmark sizes above that.

Change-Id: I5e6facc1eb8e1b80e5ca285e4dd2cc8815618dad
Reviewed-on: https://go-review.googlesource.com/76850
Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
src/encoding/json/bench_test.go
src/encoding/json/encode.go