diff options
author | Martin Möhrmann <moehrmann@google.com> | 2020-05-03 16:26:05 +0200 |
---|---|---|
committer | Martin Möhrmann <moehrmann@google.com> | 2020-08-17 04:56:56 +0000 |
commit | f979d072d339a24e4938d46588c153587d61af19 (patch) | |
tree | a846d2e135e54d7ab3d4e59ed948a17f72a008e2 /src/runtime/map_fast64.go | |
parent | 99f179f55a66f35dc7861fa411b42ed61bd0df31 (diff) | |
download | go-f979d072d339a24e4938d46588c153587d61af19.tar.gz go-f979d072d339a24e4938d46588c153587d61af19.zip |
runtime: avoid memclr call for keys in mapdelete_fast
Replace memclrHasPointers calls for keys in mapdelete_fast*
functions with direct writes since the key sizes are known
at compile time.
name old time/op new time/op delta
MapDelete/Pointer/100 33.7ns ± 1% 23.7ns ± 2% -29.68% (p=0.000 n=7+9)
MapDelete/Pointer/1000 41.6ns ± 5% 34.9ns ± 4% -16.01% (p=0.000 n=9+10)
MapDelete/Pointer/10000 45.6ns ± 1% 38.2ns ± 2% -16.34% (p=0.000 n=8+10)
Change-Id: Icaac43b520b93c2cf9fd192b822fae7203a7bbf7
Reviewed-on: https://go-review.googlesource.com/c/go/+/231737
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/runtime/map_fast64.go')
-rw-r--r-- | src/runtime/map_fast64.go | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/runtime/map_fast64.go b/src/runtime/map_fast64.go index 1669c7cfe9..f1f3927598 100644 --- a/src/runtime/map_fast64.go +++ b/src/runtime/map_fast64.go @@ -300,7 +300,13 @@ search: } // Only clear key if there are pointers in it. if t.key.ptrdata != 0 { - memclrHasPointers(k, t.key.size) + if sys.PtrSize == 8 { + *(*unsafe.Pointer)(k) = nil + } else { + // There are three ways to squeeze at one ore more 32 bit pointers into 64 bits. + // Just call memclrHasPointers instead of trying to handle all cases here. + memclrHasPointers(k, 8) + } } e := add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.elemsize)) if t.elem.ptrdata != 0 { |