diff options
| author | Vladimir Kuzmin <vkuzmin@uber.com> | 2018-06-20 22:19:56 -0700 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2018-06-26 01:57:01 +0000 |
| commit | b080abf656feea5946922b2782bfeaa73cc317d4 (patch) | |
| tree | d9bfb2e714e3b5bed83f0badd7a256f245e24f2a /src/runtime/map_fast32.go | |
| parent | 3c586d4483b0cf59cd57adec150317c497065845 (diff) | |
| download | go-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_fast32.go')
| -rw-r--r-- | src/runtime/map_fast32.go | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/runtime/map_fast32.go b/src/runtime/map_fast32.go index 296569772b..bf0b23604b 100644 --- a/src/runtime/map_fast32.go +++ b/src/runtime/map_fast32.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*4+i*uintptr(t.valuesize)) if t.elem.kind&kindNoPointers == 0 { - v := add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.valuesize)) memclrHasPointers(v, t.elem.size) + } else { + memclrNoHeapPointers(v, t.elem.size) } b.tophash[i] = empty h.count-- |
