mirror of
https://github.com/golang/go
synced 2024-10-14 11:53:56 +00:00
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
This commit is contained in:
parent
3f6dbfc44c
commit
46b4ed2cf0
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue