From: Brad Fitzpatrick Date: Wed, 18 Dec 2013 23:52:05 +0000 (-0800) Subject: encoding/json: use sync.Pool X-Git-Tag: go1.3beta1~1154 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=46b4ed2cf065a9877257c6641e40a0e3cd1468fd;p=gostls13.git encoding/json: use sync.Pool Benchmark is within the noise. I had to run this a dozen times each before & after (on wall power, without a browser running) before I could get halfway consistent numbers, and even then they jumped all over the place, with the new one sometimes being better. But these are the best of a dozen each. Slowdown is expected anyway, since I imagine channels are optimized more. benchmark old ns/op new ns/op delta BenchmarkCodeEncoder 26556987 27291072 +2.76% BenchmarkEncoderEncode 1069 1071 +0.19% benchmark old MB/s new MB/s speedup BenchmarkCodeEncoder 73.07 71.10 0.97x benchmark old allocs new allocs delta BenchmarkEncoderEncode 2 2 0.00% benchmark old bytes new bytes delta BenchmarkEncoderEncode 221 221 0.00% Update #4720 R=golang-dev, iant CC=golang-dev https://golang.org/cl/37720047 --- diff --git a/src/pkg/encoding/json/encode.go b/src/pkg/encoding/json/encode.go index 8c71770ca4..4a77ba1cd2 100644 --- a/src/pkg/encoding/json/encode.go +++ b/src/pkg/encoding/json/encode.go @@ -241,24 +241,15 @@ type encodeState struct { scratch [64]byte } -// TODO(bradfitz): use a sync.Cache here -var encodeStatePool = make(chan *encodeState, 8) +var encodeStatePool sync.Pool func newEncodeState() *encodeState { - select { - case e := <-encodeStatePool: + if v := encodeStatePool.Get(); v != nil { + e := v.(*encodeState) e.Reset() return e - default: - return new(encodeState) - } -} - -func putEncodeState(e *encodeState) { - select { - case encodeStatePool <- e: - default: } + return new(encodeState) } func (e *encodeState) marshal(v interface{}) (err error) { diff --git a/src/pkg/encoding/json/stream.go b/src/pkg/encoding/json/stream.go index 1928abadb7..e8d6bd4c2c 100644 --- a/src/pkg/encoding/json/stream.go +++ b/src/pkg/encoding/json/stream.go @@ -173,7 +173,7 @@ func (enc *Encoder) Encode(v interface{}) error { if _, err = enc.w.Write(e.Bytes()); err != nil { enc.err = err } - putEncodeState(e) + encodeStatePool.Put(e) return err }