mirror of
https://github.com/golang/go.git
synced 2025-11-10 05:31:03 +00:00
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: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
541620409d
commit
88f4bccec5
1 changed files with 10 additions and 10 deletions
|
|
@ -674,7 +674,7 @@ type mapEncoder struct {
|
|||
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() {
|
||||
e.WriteString("null")
|
||||
return
|
||||
|
|
@ -713,7 +713,7 @@ func newMapEncoder(t reflect.Type) encoderFunc {
|
|||
return unsupportedTypeEncoder
|
||||
}
|
||||
}
|
||||
me := &mapEncoder{typeEncoder(t.Elem())}
|
||||
me := mapEncoder{typeEncoder(t.Elem())}
|
||||
return me.encode
|
||||
}
|
||||
|
||||
|
|
@ -752,7 +752,7 @@ type sliceEncoder struct {
|
|||
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() {
|
||||
e.WriteString("null")
|
||||
return
|
||||
|
|
@ -768,7 +768,7 @@ func newSliceEncoder(t reflect.Type) encoderFunc {
|
|||
return encodeByteSlice
|
||||
}
|
||||
}
|
||||
enc := &sliceEncoder{newArrayEncoder(t)}
|
||||
enc := sliceEncoder{newArrayEncoder(t)}
|
||||
return enc.encode
|
||||
}
|
||||
|
||||
|
|
@ -776,7 +776,7 @@ type arrayEncoder struct {
|
|||
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('[')
|
||||
n := v.Len()
|
||||
for i := 0; i < n; i++ {
|
||||
|
|
@ -789,7 +789,7 @@ func (ae *arrayEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
|
|||
}
|
||||
|
||||
func newArrayEncoder(t reflect.Type) encoderFunc {
|
||||
enc := &arrayEncoder{typeEncoder(t.Elem())}
|
||||
enc := arrayEncoder{typeEncoder(t.Elem())}
|
||||
return enc.encode
|
||||
}
|
||||
|
||||
|
|
@ -797,7 +797,7 @@ type ptrEncoder struct {
|
|||
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() {
|
||||
e.WriteString("null")
|
||||
return
|
||||
|
|
@ -806,7 +806,7 @@ func (pe *ptrEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
|
|||
}
|
||||
|
||||
func newPtrEncoder(t reflect.Type) encoderFunc {
|
||||
enc := &ptrEncoder{typeEncoder(t.Elem())}
|
||||
enc := ptrEncoder{typeEncoder(t.Elem())}
|
||||
return enc.encode
|
||||
}
|
||||
|
||||
|
|
@ -814,7 +814,7 @@ type condAddrEncoder struct {
|
|||
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() {
|
||||
ce.canAddrEnc(e, v, opts)
|
||||
} else {
|
||||
|
|
@ -825,7 +825,7 @@ func (ce *condAddrEncoder) encode(e *encodeState, v reflect.Value, opts encOpts)
|
|||
// newCondAddrEncoder returns an encoder that checks whether its value
|
||||
// CanAddr and delegates to canAddrEnc if so, else to elseEnc.
|
||||
func newCondAddrEncoder(canAddrEnc, elseEnc encoderFunc) encoderFunc {
|
||||
enc := &condAddrEncoder{canAddrEnc: canAddrEnc, elseEnc: elseEnc}
|
||||
enc := condAddrEncoder{canAddrEnc: canAddrEnc, elseEnc: elseEnc}
|
||||
return enc.encode
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue