diff options
| author | Rob Pike <r@golang.org> | 2014-10-14 20:03:35 -0700 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2014-10-14 20:03:35 -0700 |
| commit | ae250ab227311aab7fd8dff22ae05592abd13bde (patch) | |
| tree | 33261b064848a851ade484e76bf61eb42d358f06 /src/encoding/gob/encode.go | |
| parent | fe8f799ef7b0124ff0a50f5ec590a70ad20d6ef2 (diff) | |
| download | go-ae250ab227311aab7fd8dff22ae05592abd13bde.tar.xz | |
encoding/gob: make encoding structs a little faster
FieldByIndex never returns an invalid Value, so the validity
test can be avoided if the field is not indirect.
BenchmarkGobEncode 12768642 12424022 -2.70%
BenchmarkGobEncode 60.11 61.78 1.03x
LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/158890045
Diffstat (limited to 'src/encoding/gob/encode.go')
| -rw-r--r-- | src/encoding/gob/encode.go | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/encoding/gob/encode.go b/src/encoding/gob/encode.go index b7bf8b0022..04a85410c6 100644 --- a/src/encoding/gob/encode.go +++ b/src/encoding/gob/encode.go @@ -281,15 +281,16 @@ func (enc *Encoder) encodeStruct(b *bytes.Buffer, engine *encEngine, value refle field := value.FieldByIndex(instr.index) if instr.indir > 0 { field = encIndirect(field, instr.indir) - } - if !valid(field) { - continue + // TODO: Is field guaranteed valid? If so we could avoid this check. + if !valid(field) { + continue + } } instr.op(instr, state, field) } } -// encodeArray encodes the array whose 0th element is at p. +// encodeArray encodes an array. func (enc *Encoder) encodeArray(b *bytes.Buffer, value reflect.Value, op encOp, elemIndir int, length int) { state := enc.newEncoderState(b) defer enc.freeEncoderState(state) @@ -300,6 +301,7 @@ func (enc *Encoder) encodeArray(b *bytes.Buffer, value reflect.Value, op encOp, elem := value.Index(i) if elemIndir > 0 { elem = encIndirect(elem, elemIndir) + // TODO: Is elem guaranteed valid? If so we could avoid this check. if !valid(elem) { errorf("encodeArray: nil element") } |
