]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.14] runtime: special case interface hashing for pointers
authorKeith Randall <khr@golang.org>
Thu, 13 Feb 2020 16:34:41 +0000 (08:34 -0800)
committerAlexander Rakoczy <alex@golang.org>
Tue, 10 Mar 2020 20:05:44 +0000 (20:05 +0000)
Interfaces often contain pointers. Implement a fast path for this case.

name                   old time/op  new time/op  delta
MapInterfaceString-16  21.4ns ±19%  20.5ns ±10%     ~     (p=0.361 n=10+10)
MapInterfacePtr-16     25.8ns ± 8%  17.3ns ± 7%  -33.11%  (p=0.000 n=10+9)

We need this CL as well to fix 37721.
Update #37721
Fixes #37613

Change-Id: Ice52820e6259a3edeafcbbbeb25b1e363bef00d0
Reviewed-on: https://go-review.googlesource.com/c/go/+/219338
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
(cherry picked from commit afd691c579198387c874512ef1c75db651dba9bd)
Reviewed-on: https://go-review.googlesource.com/c/go/+/222779
Run-TryBot: Alexander Rakoczy <alex@golang.org>

src/runtime/alg.go

index d8789b4b5f31bba9da25a87fc5ad78503ffb5849..5a0656513d0f67c9e4002805deba9249a529ba2b 100644 (file)
@@ -160,7 +160,15 @@ func nilinterhash(p unsafe.Pointer, h uintptr) uintptr {
 // maps generated by reflect.MapOf (reflect_typehash, below).
 func typehash(t *_type, p unsafe.Pointer, h uintptr) uintptr {
        if t.tflag&tflagRegularMemory != 0 {
-               return memhash(p, h, t.size)
+               // Handle ptr sizes specially, see issue 37086.
+               switch t.size {
+               case 4:
+                       return memhash32(p, h)
+               case 8:
+                       return memhash64(p, h)
+               default:
+                       return memhash(p, h, t.size)
+               }
        }
        switch t.kind & kindMask {
        case kindFloat32: