]> Cypherpunks repositories - gostls13.git/commit
encoding/json: remove allocation when using a Marshaler with value receiver
authorPhil Pearl <philip.j.r.pearl@gmail.com>
Sun, 27 Oct 2019 16:05:54 +0000 (16:05 +0000)
committerDaniel Martí <mvdan@mvdan.cc>
Mon, 28 Oct 2019 11:22:20 +0000 (11:22 +0000)
commitacbed0372ea000db8b1ea69eca9d7acecdf89469
treebb95e2140acc362224ee8071fc9642ad5d511f02
parent33e3983db805ccf27f34a143d91e4346233a0ee2
encoding/json: remove allocation when using a Marshaler with value receiver

If we marshal a non-pointer struct field whose type implements Marshaler with
a non-pointer receiver, then we avoid an allocation if we take the address of
the field before casting it to an interface.

name               old time/op    new time/op    delta
EncodeMarshaler-8     104ns ± 1%      92ns ± 2%  -11.72%  (p=0.001 n=7+7)

name               old alloc/op   new alloc/op   delta
EncodeMarshaler-8     36.0B ± 0%      4.0B ± 0%  -88.89%  (p=0.000 n=8+8)

name               old allocs/op  new allocs/op  delta
EncodeMarshaler-8      2.00 ± 0%      1.00 ± 0%  -50.00%  (p=0.000 n=8+8)

Test coverage already looks good enough for this change. TestRefValMarshal
already covers all possible combinations of value & pointer receivers on
value and pointer struct fields.

Change-Id: I6fc7f72396396d98f9a90c3c86e813690f41c099
Reviewed-on: https://go-review.googlesource.com/c/go/+/203608
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
src/encoding/json/encode.go