aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/map.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.go
parent3c586d4483b0cf59cd57adec150317c497065845 (diff)
downloadgo-b080abf656feea5946922b2782bfeaa73cc317d4.tar.xz
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.go')
-rw-r--r--src/runtime/map.go15
1 files changed, 7 insertions, 8 deletions
diff --git a/src/runtime/map.go b/src/runtime/map.go
index cc1358a977..0e00f12974 100644
--- a/src/runtime/map.go
+++ b/src/runtime/map.go
@@ -707,14 +707,13 @@ search:
} else if t.key.kind&kindNoPointers == 0 {
memclrHasPointers(k, t.key.size)
}
- // Only clear value if there are pointers in it.
- if t.indirectvalue || t.elem.kind&kindNoPointers == 0 {
- v := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.valuesize))
- if t.indirectvalue {
- *(*unsafe.Pointer)(v) = nil
- } else {
- memclrHasPointers(v, t.elem.size)
- }
+ v := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.valuesize))
+ if t.indirectvalue {
+ *(*unsafe.Pointer)(v) = nil
+ } else if t.elem.kind&kindNoPointers == 0 {
+ memclrHasPointers(v, t.elem.size)
+ } else {
+ memclrNoHeapPointers(v, t.elem.size)
}
b.tophash[i] = empty
h.count--