Commit 46b4ed2c authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

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
parent 3f6dbfc4
......@@ -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) {
......
......@@ -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
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment