summaryrefslogtreecommitdiff
path: root/src/encoding
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2014-10-14 20:03:35 -0700
committerRob Pike <r@golang.org>2014-10-14 20:03:35 -0700
commit3d4a92a2e6eb8efa60e84bd53be2280288e0bf2f (patch)
tree22ab3f59849109d07dd61ffc560ba35c402a7fa5 /src/encoding
parent9ddeb99a986ff9c6dacc218359d9aa09111cbfa6 (diff)
downloadgo-3d4a92a2e6eb8efa60e84bd53be2280288e0bf2f.tar.gz
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://codereview.appspot.com/158890045
Diffstat (limited to 'src/encoding')
-rw-r--r--src/encoding/gob/encode.go10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/encoding/gob/encode.go b/src/encoding/gob/encode.go
index b7bf8b002..04a85410c 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")
}