aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/map_fast64.go
diff options
context:
space:
mode:
authorVladimir Kuzmin <vkuzmin@uber.com>2018-06-20 22:19:56 -0700
committerKeith Randall <khr@golang.org>2018-06-26 01:57:01 +0000
commitb080abf656feea5946922b2782bfeaa73cc317d4 (patch)
treed9bfb2e714e3b5bed83f0badd7a256f245e24f2a /src/runtime/map_fast64.go
parent3c586d4483b0cf59cd57adec150317c497065845 (diff)
downloadgo-b080abf656feea5946922b2782bfeaa73cc317d4.tar.gz
go-b080abf656feea5946922b2782bfeaa73cc317d4.zip
cmd/compile: map delete should clear value always
Map delete must clear value every time because newly added map optimizations of compound-assignment operators (CL #91557) rely on this behavior of map delete. It slows down map delete operation for non-reference types: name old time/op new time/op delta MapDelete/Int32/100 23.9ns ± 2% 27.8ns ± 4% +16.04% (p=0.000 n=20+20) MapDelete/Int32/1000 21.5ns ± 2% 25.2ns ± 2% +17.06% (p=0.000 n=20+19) MapDelete/Int32/10000 24.2ns ± 6% 27.2ns ± 5% +12.39% (p=0.000 n=19+19) MapDelete/Int64/100 24.2ns ± 4% 27.7ns ± 2% +14.55% (p=0.000 n=20+20) MapDelete/Int64/1000 22.1ns ± 2% 24.8ns ± 2% +12.36% (p=0.000 n=10+20) Fixes #25936 Change-Id: I8499b790cb5bb019938161b3e50f3243d9bbb79c Reviewed-on: https://go-review.googlesource.com/120255 Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com> Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/runtime/map_fast64.go')
-rw-r--r--src/runtime/map_fast64.go5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/runtime/map_fast64.go b/src/runtime/map_fast64.go
index aa3eff8ac8..4bde9e2be0 100644
--- a/src/runtime/map_fast64.go
+++ b/src/runtime/map_fast64.go
@@ -293,10 +293,11 @@ search:
if t.key.kind&kindNoPointers == 0 {
memclrHasPointers(k, t.key.size)
}
- // Only clear value if there are pointers in it.
+ v := add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.valuesize))
if t.elem.kind&kindNoPointers == 0 {
- v := add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.valuesize))
memclrHasPointers(v, t.elem.size)
+ } else {
+ memclrNoHeapPointers(v, t.elem.size)
}
b.tophash[i] = empty
h.count--