diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2015-01-29 19:40:02 +0300 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2015-02-12 09:53:52 +0000 |
commit | b3be360f16c44d21b2594d06e8d0e609e8fe3c0c (patch) | |
tree | 5b0e68bbef52bb97fe8a520ceb2daea7567b7ac1 /test/escape2n.go | |
parent | aed88be021762c590f50ab80f8cc155e2c55c39f (diff) | |
download | go-b3be360f16c44d21b2594d06e8d0e609e8fe3c0c.tar.gz go-b3be360f16c44d21b2594d06e8d0e609e8fe3c0c.zip |
cmd/gc: allocate non-escaping maps on stack
Extend escape analysis to make(map[k]v).
If it does not escape, allocate temp buffer for hmap and one bucket on stack.
There are 75 cases of non-escaping maps in std lib.
benchmark old allocs new allocs delta
BenchmarkConcurrentStmtQuery 16161 15161 -6.19%
BenchmarkConcurrentTxQuery 17658 16658 -5.66%
BenchmarkConcurrentTxStmtQuery 16157 15156 -6.20%
BenchmarkConcurrentRandom 13637 13114 -3.84%
BenchmarkManyConcurrentQueries 22 20 -9.09%
BenchmarkDecodeComplex128Slice 250 188 -24.80%
BenchmarkDecodeFloat64Slice 250 188 -24.80%
BenchmarkDecodeInt32Slice 250 188 -24.80%
BenchmarkDecodeStringSlice 2250 2188 -2.76%
BenchmarkNewEmptyMap 1 0 -100.00%
BenchmarkNewSmallMap 2 0 -100.00%
benchmark old ns/op new ns/op delta
BenchmarkNewEmptyMap 124 55.7 -55.08%
BenchmarkNewSmallMap 317 148 -53.31%
benchmark old allocs new allocs delta
BenchmarkNewEmptyMap 1 0 -100.00%
BenchmarkNewSmallMap 2 0 -100.00%
benchmark old bytes new bytes delta
BenchmarkNewEmptyMap 48 0 -100.00%
BenchmarkNewSmallMap 192 0 -100.00%
Fixes #5449
Change-Id: I24fa66f949d2f138885d9e66a0d160240dc9e8fa
Reviewed-on: https://go-review.googlesource.com/3508
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Dmitry Vyukov <dvyukov@google.com>
Diffstat (limited to 'test/escape2n.go')
-rw-r--r-- | test/escape2n.go | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/test/escape2n.go b/test/escape2n.go index d9d95e81dc..ddd5693485 100644 --- a/test/escape2n.go +++ b/test/escape2n.go @@ -1751,3 +1751,20 @@ func slicerunetostring2() { r := []rune{1, 2, 3} // ERROR "\[\]rune literal does not escape" sink = string(r) // ERROR "string\(r\) escapes to heap" } + +func makemap0() { + m := make(map[int]int) // ERROR "make\(map\[int\]int\, 0\) does not escape" + m[0] = 0 + m[1]++ + delete(m, 1) + sink = m[0] +} + +func makemap1() map[int]int { + return make(map[int]int) // ERROR "make\(map\[int\]int\, 0\) escapes to heap" +} + +func makemap2() { + m := make(map[int]int) // ERROR "make\(map\[int\]int\, 0\) escapes to heap" + sink = m +} |