From 73516c5f481250db4ccbfdddb8f68ef261897fcb Mon Sep 17 00:00:00 2001 From: David Crawshaw Date: Mon, 27 Jun 2016 11:07:08 -0400 Subject: encoding/gob: avoid allocating string for map key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/encoding/gob/decode.go | 6 +++--- 1 file 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) -- cgit v1.2.3-54-g00ecf