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_fast64.go | |
parent | 3c586d4483b0cf59cd57adec150317c497065845 (diff) | |
download | go-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.go | 5 |
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-- |