Commit 88f4bcce authored by Daniel Martí's avatar Daniel Martí

encoding/json: avoid some more pointer receivers

A few encoder struct types, such as map and slice, only encapsulate
other prepared encoder funcs. Using pointer receivers has no advantage,
and makes calling these methods slightly more expensive.

Not a huge performance win, but certainly an easy one. The struct types
used in the benchmark below contain one slice field and one pointer
field.

name           old time/op    new time/op    delta
CodeEncoder-4    5.48ms ± 0%    5.39ms ± 0%  -1.66%  (p=0.010 n=6+4)

name           old speed      new speed      delta
CodeEncoder-4   354MB/s ± 0%   360MB/s ± 0%  +1.69%  (p=0.010 n=6+4)

Updates #5683.

Change-Id: I9f78dbe07fcc6fbf19a6d96c22f5d6970db9eca4
Reviewed-on: https://go-review.googlesource.com/131400
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 54162040
...@@ -674,7 +674,7 @@ type mapEncoder struct { ...@@ -674,7 +674,7 @@ type mapEncoder struct {
elemEnc encoderFunc elemEnc encoderFunc
} }
func (me *mapEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) { func (me mapEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
if v.IsNil() { if v.IsNil() {
e.WriteString("null") e.WriteString("null")
return return
...@@ -713,7 +713,7 @@ func newMapEncoder(t reflect.Type) encoderFunc { ...@@ -713,7 +713,7 @@ func newMapEncoder(t reflect.Type) encoderFunc {
return unsupportedTypeEncoder return unsupportedTypeEncoder
} }
} }
me := &mapEncoder{typeEncoder(t.Elem())} me := mapEncoder{typeEncoder(t.Elem())}
return me.encode return me.encode
} }
...@@ -752,7 +752,7 @@ type sliceEncoder struct { ...@@ -752,7 +752,7 @@ type sliceEncoder struct {
arrayEnc encoderFunc arrayEnc encoderFunc
} }
func (se *sliceEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) { func (se sliceEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
if v.IsNil() { if v.IsNil() {
e.WriteString("null") e.WriteString("null")
return return
...@@ -768,7 +768,7 @@ func newSliceEncoder(t reflect.Type) encoderFunc { ...@@ -768,7 +768,7 @@ func newSliceEncoder(t reflect.Type) encoderFunc {
return encodeByteSlice return encodeByteSlice
} }
} }
enc := &sliceEncoder{newArrayEncoder(t)} enc := sliceEncoder{newArrayEncoder(t)}
return enc.encode return enc.encode
} }
...@@ -776,7 +776,7 @@ type arrayEncoder struct { ...@@ -776,7 +776,7 @@ type arrayEncoder struct {
elemEnc encoderFunc elemEnc encoderFunc
} }
func (ae *arrayEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) { func (ae arrayEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
e.WriteByte('[') e.WriteByte('[')
n := v.Len() n := v.Len()
for i := 0; i < n; i++ { for i := 0; i < n; i++ {
...@@ -789,7 +789,7 @@ func (ae *arrayEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) { ...@@ -789,7 +789,7 @@ func (ae *arrayEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
} }
func newArrayEncoder(t reflect.Type) encoderFunc { func newArrayEncoder(t reflect.Type) encoderFunc {
enc := &arrayEncoder{typeEncoder(t.Elem())} enc := arrayEncoder{typeEncoder(t.Elem())}
return enc.encode return enc.encode
} }
...@@ -797,7 +797,7 @@ type ptrEncoder struct { ...@@ -797,7 +797,7 @@ type ptrEncoder struct {
elemEnc encoderFunc elemEnc encoderFunc
} }
func (pe *ptrEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) { func (pe ptrEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
if v.IsNil() { if v.IsNil() {
e.WriteString("null") e.WriteString("null")
return return
...@@ -806,7 +806,7 @@ func (pe *ptrEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) { ...@@ -806,7 +806,7 @@ func (pe *ptrEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
} }
func newPtrEncoder(t reflect.Type) encoderFunc { func newPtrEncoder(t reflect.Type) encoderFunc {
enc := &ptrEncoder{typeEncoder(t.Elem())} enc := ptrEncoder{typeEncoder(t.Elem())}
return enc.encode return enc.encode
} }
...@@ -814,7 +814,7 @@ type condAddrEncoder struct { ...@@ -814,7 +814,7 @@ type condAddrEncoder struct {
canAddrEnc, elseEnc encoderFunc canAddrEnc, elseEnc encoderFunc
} }
func (ce *condAddrEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) { func (ce condAddrEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
if v.CanAddr() { if v.CanAddr() {
ce.canAddrEnc(e, v, opts) ce.canAddrEnc(e, v, opts)
} else { } else {
...@@ -825,7 +825,7 @@ func (ce *condAddrEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) ...@@ -825,7 +825,7 @@ func (ce *condAddrEncoder) encode(e *encodeState, v reflect.Value, opts encOpts)
// newCondAddrEncoder returns an encoder that checks whether its value // newCondAddrEncoder returns an encoder that checks whether its value
// CanAddr and delegates to canAddrEnc if so, else to elseEnc. // CanAddr and delegates to canAddrEnc if so, else to elseEnc.
func newCondAddrEncoder(canAddrEnc, elseEnc encoderFunc) encoderFunc { func newCondAddrEncoder(canAddrEnc, elseEnc encoderFunc) encoderFunc {
enc := &condAddrEncoder{canAddrEnc: canAddrEnc, elseEnc: elseEnc} enc := condAddrEncoder{canAddrEnc: canAddrEnc, elseEnc: elseEnc}
return enc.encode return enc.encode
} }
......
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