diff options
author | David Crawshaw <crawshaw@golang.org> | 2016-06-27 11:07:08 -0400 |
---|---|---|
committer | David Crawshaw <crawshaw@golang.org> | 2016-06-28 01:50:48 +0000 |
commit | 73516c5f481250db4ccbfdddb8f68ef261897fcb (patch) | |
tree | 8d0998e1b503b5ea115f7c1718a6e737c7a1143e /src/encoding/gob/decode.go | |
parent | 8d966bad6e4e9e28295bccbd739bf5280f729a7b (diff) | |
download | go-73516c5f481250db4ccbfdddb8f68ef261897fcb.tar.gz go-73516c5f481250db4ccbfdddb8f68ef261897fcb.zip |
encoding/gob: avoid allocating string for map key
On linux/386 compared to tip:
name old time/op new time/op delta
DecodeInterfaceSlice-40 1.23ms ± 1% 1.17ms ± 1% -4.93% (p=0.000 n=9+10)
Recovers about half the performance regression from Go 1.6 on 386.
For #16117.
Change-Id: Ie8676d92a4da3e27ff21b91a98b3e13d16730ba1
Reviewed-on: https://go-review.googlesource.com/24468
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/encoding/gob/decode.go')
-rw-r--r-- | src/encoding/gob/decode.go | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/encoding/gob/decode.go b/src/encoding/gob/decode.go index 3b2249f616..9645dc5790 100644 --- a/src/encoding/gob/decode.go +++ b/src/encoding/gob/decode.go @@ -645,10 +645,10 @@ func (dec *Decoder) decodeInterface(ityp reflect.Type, state *decoderState, valu errorf("invalid type name length %d: exceeds input size", nr) } n := int(nr) - name := string(state.b.Bytes()[:n]) + name := state.b.Bytes()[:n] state.b.Drop(n) // Allocate the destination interface value. - if name == "" { + if len(name) == 0 { // Copy the nil interface value to the target. value.Set(reflect.Zero(value.Type())) return @@ -658,7 +658,7 @@ func (dec *Decoder) decodeInterface(ityp reflect.Type, state *decoderState, valu } // The concrete type must be registered. registerLock.RLock() - typ, ok := nameToConcreteType[name] + typ, ok := nameToConcreteType[string(name)] registerLock.RUnlock() if !ok { errorf("name not registered for interface: %q", name) |