]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/json: make use of encodeStatePool in Marshal
authorJeremy Jackins <jeremyjackins@gmail.com>
Tue, 19 Dec 2017 23:43:30 +0000 (15:43 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 13 Apr 2018 17:31:52 +0000 (17:31 +0000)
On my system, this seems to be a significant win, with a major
reduction in allocations and minor speed improvement.

name           old time/op    new time/op    delta
CodeMarshal      9.75ms ± 3%    9.24ms ± 1%   -5.21%  (p=0.001 n=5+10)
CodeMarshal-4    4.98ms ± 1%    4.71ms ± 1%   -5.44%  (p=0.001 n=5+10)
CodeMarshal-8    4.80ms ± 0%    4.77ms ± 1%   -0.70%  (p=0.012 n=5+9)

name           old speed      new speed      delta
CodeMarshal     199MB/s ± 3%   210MB/s ± 1%   +5.46%  (p=0.001 n=5+10)
CodeMarshal-4   390MB/s ± 1%   412MB/s ± 1%   +5.76%  (p=0.001 n=5+10)
CodeMarshal-8   404MB/s ± 0%   407MB/s ± 1%   +0.70%  (p=0.012 n=5+9)

name           old alloc/op   new alloc/op   delta
CodeMarshal      4.59MB ± 0%    1.96MB ± 0%  -57.22%  (p=0.000 n=5+9)
CodeMarshal-4    4.59MB ± 0%    2.00MB ± 0%  -56.39%  (p=0.000 n=5+8)
CodeMarshal-8    4.59MB ± 0%    2.06MB ± 0%  -55.05%  (p=0.001 n=5+9)

name           old allocs/op  new allocs/op  delta
CodeMarshal        16.0 ± 0%       1.0 ± 0%  -93.75%  (p=0.000 n=5+10)
CodeMarshal-4      16.0 ± 0%       1.0 ± 0%  -93.75%  (p=0.000 n=5+10)
CodeMarshal-8      16.0 ± 0%       1.0 ± 0%  -93.75%  (p=0.000 n=5+10)

Change-Id: I9d09850d8227f523f861ae1b4ca248c4a4b16aaf
Reviewed-on: https://go-review.googlesource.com/84897
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/encoding/json/encode.go

index 46aa78a70bde219d7957d8e4e585420cfd1c28c6..99407e0f7ab956fd3044a643ee50a95ac438bdc9 100644 (file)
@@ -155,12 +155,18 @@ import (
 // an infinite recursion.
 //
 func Marshal(v interface{}) ([]byte, error) {
-       e := &encodeState{}
+       e := newEncodeState()
+
        err := e.marshal(v, encOpts{escapeHTML: true})
        if err != nil {
                return nil, err
        }
-       return e.Bytes(), nil
+       buf := append([]byte(nil), e.Bytes()...)
+
+       e.Reset()
+       encodeStatePool.Put(e)
+
+       return buf, nil
 }
 
 // MarshalIndent is like Marshal but applies Indent to format the output.