• Phil Pearl's avatar
    encoding/json: remove allocation when using a Marshaler with value receiver · acbed037
    Phil Pearl authored
    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/+/203608Reviewed-by: default avatarDaniel Martí <mvdan@mvdan.cc>
    Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    acbed037
encode.go 36.3 KB