From: Keith Randall Date: Thu, 13 Feb 2020 16:34:41 +0000 (-0800) Subject: [release-branch.go1.14] runtime: special case interface hashing for pointers X-Git-Tag: go1.14.1~8 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6717d27be2c1a67b1d7e8c7d426594c49a818b90;p=gostls13.git [release-branch.go1.14] runtime: special case interface hashing for pointers 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 TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang (cherry picked from commit afd691c579198387c874512ef1c75db651dba9bd) Reviewed-on: https://go-review.googlesource.com/c/go/+/222779 Run-TryBot: Alexander Rakoczy --- diff --git a/src/runtime/alg.go b/src/runtime/alg.go index d8789b4b5f..5a0656513d 100644 --- a/src/runtime/alg.go +++ b/src/runtime/alg.go @@ -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: