1 // Copyright 2013 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
15 func BenchmarkHashStringSpeed(b
*testing
.B
) {
16 strings
:= make([]string, size
)
17 for i
:= 0; i
< size
; i
++ {
18 strings
[i
] = fmt
.Sprintf("string#%d", i
)
21 m
:= make(map[string]int, size
)
22 for i
:= 0; i
< size
; i
++ {
27 for i
:= 0; i
< b
.N
; i
++ {
28 sum
+= m
[strings
[idx
]]
38 func BenchmarkHashBytesSpeed(b
*testing
.B
) {
39 // a bunch of chunks, each with a different alignment mod 16
40 var chunks
[size
]chunk
41 // initialize each to a different value
42 for i
:= 0; i
< size
; i
++ {
43 chunks
[i
][0] = byte(i
)
46 m
:= make(map[chunk
]int, size
)
47 for i
, c
:= range chunks
{
52 for i
:= 0; i
< b
.N
; i
++ {
53 if m
[chunks
[idx
]] != idx
{
54 b
.Error("bad map entry for chunk")
63 func BenchmarkHashInt32Speed(b
*testing
.B
) {
64 ints
:= make([]int32, size
)
65 for i
:= 0; i
< size
; i
++ {
69 m
:= make(map[int32]int, size
)
70 for i
:= 0; i
< size
; i
++ {
75 for i
:= 0; i
< b
.N
; i
++ {
84 func BenchmarkHashInt64Speed(b
*testing
.B
) {
85 ints
:= make([]int64, size
)
86 for i
:= 0; i
< size
; i
++ {
90 m
:= make(map[int64]int, size
)
91 for i
:= 0; i
< size
; i
++ {
96 for i
:= 0; i
< b
.N
; i
++ {
104 func BenchmarkHashStringArraySpeed(b
*testing
.B
) {
105 stringpairs
:= make([][2]string, size
)
106 for i
:= 0; i
< size
; i
++ {
107 for j
:= 0; j
< 2; j
++ {
108 stringpairs
[i
][j
] = fmt
.Sprintf("string#%d/%d", i
, j
)
112 m
:= make(map[[2]string]int, size
)
113 for i
:= 0; i
< size
; i
++ {
114 m
[stringpairs
[i
]] = 0
118 for i
:= 0; i
< b
.N
; i
++ {
119 sum
+= m
[stringpairs
[idx
]]
127 func BenchmarkMegMap(b
*testing
.B
) {
128 m
:= make(map[string]bool)
129 for suffix
:= 'A'; suffix
<= 'G'; suffix
++ {
130 m
[strings
.Repeat("X", 1<<20-1)+fmt
.Sprint(suffix
)] = true
132 key
:= strings
.Repeat("X", 1<<20-1) + "k"
134 for i
:= 0; i
< b
.N
; i
++ {
139 func BenchmarkMegOneMap(b
*testing
.B
) {
140 m
:= make(map[string]bool)
141 m
[strings
.Repeat("X", 1<<20)] = true
142 key
:= strings
.Repeat("Y", 1<<20)
144 for i
:= 0; i
< b
.N
; i
++ {
149 func BenchmarkMegEqMap(b
*testing
.B
) {
150 m
:= make(map[string]bool)
151 key1
:= strings
.Repeat("X", 1<<20)
152 key2
:= strings
.Repeat("X", 1<<20) // equal but different instance
155 for i
:= 0; i
< b
.N
; i
++ {
160 func BenchmarkMegEmptyMap(b
*testing
.B
) {
161 m
:= make(map[string]bool)
162 key
:= strings
.Repeat("X", 1<<20)
164 for i
:= 0; i
< b
.N
; i
++ {
169 func BenchmarkSmallStrMap(b
*testing
.B
) {
170 m
:= make(map[string]bool)
171 for suffix
:= 'A'; suffix
<= 'G'; suffix
++ {
172 m
[fmt
.Sprint(suffix
)] = true
176 for i
:= 0; i
< b
.N
; i
++ {
181 func BenchmarkMapStringKeysEight_16(b
*testing
.B
) { benchmarkMapStringKeysEight(b
, 16) }
182 func BenchmarkMapStringKeysEight_32(b
*testing
.B
) { benchmarkMapStringKeysEight(b
, 32) }
183 func BenchmarkMapStringKeysEight_64(b
*testing
.B
) { benchmarkMapStringKeysEight(b
, 64) }
184 func BenchmarkMapStringKeysEight_1M(b
*testing
.B
) { benchmarkMapStringKeysEight(b
, 1<<20) }
186 func benchmarkMapStringKeysEight(b
*testing
.B
, keySize
int) {
187 m
:= make(map[string]bool)
188 for i
:= 0; i
< 8; i
++ {
189 m
[strings
.Repeat("K", i
+1)] = true
191 key
:= strings
.Repeat("K", keySize
)
193 for i
:= 0; i
< b
.N
; i
++ {
198 func BenchmarkIntMap(b
*testing
.B
) {
199 m
:= make(map[int]bool)
200 for i
:= 0; i
< 8; i
++ {
204 for i
:= 0; i
< b
.N
; i
++ {
209 // Accessing the same keys in a row.
210 func benchmarkRepeatedLookup(b
*testing
.B
, lookupKeySize
int) {
211 m
:= make(map[string]bool)
212 // At least bigger than a single bucket:
213 for i
:= 0; i
< 64; i
++ {
214 m
[fmt
.Sprintf("some key %d", i
)] = true
216 base
:= strings
.Repeat("x", lookupKeySize
-1)
220 for i
:= 0; i
< b
.N
/4; i
++ {
228 func BenchmarkRepeatedLookupStrMapKey32(b
*testing
.B
) { benchmarkRepeatedLookup(b
, 32) }
229 func BenchmarkRepeatedLookupStrMapKey1M(b
*testing
.B
) { benchmarkRepeatedLookup(b
, 1<<20) }
231 func BenchmarkNewEmptyMap(b
*testing
.B
) {
233 for i
:= 0; i
< b
.N
; i
++ {
234 _
= make(map[int]int)
238 func BenchmarkNewSmallMap(b
*testing
.B
) {
240 for i
:= 0; i
< b
.N
; i
++ {
241 m
:= make(map[int]int)
247 func BenchmarkMapIter(b
*testing
.B
) {
248 m
:= make(map[int]bool)
249 for i
:= 0; i
< 8; i
++ {
253 for i
:= 0; i
< b
.N
; i
++ {
259 func BenchmarkMapIterEmpty(b
*testing
.B
) {
260 m
:= make(map[int]bool)
262 for i
:= 0; i
< b
.N
; i
++ {
268 func BenchmarkSameLengthMap(b
*testing
.B
) {
269 // long strings, same length, differ in first few
270 // and last few bytes.
271 m
:= make(map[string]bool)
272 s1
:= "foo" + strings
.Repeat("-", 100) + "bar"
273 s2
:= "goo" + strings
.Repeat("-", 100) + "ber"
277 for i
:= 0; i
< b
.N
; i
++ {
284 func BenchmarkBigKeyMap(b
*testing
.B
) {
285 m
:= make(map[BigKey
]bool)
288 for i
:= 0; i
< b
.N
; i
++ {
295 func BenchmarkBigValMap(b
*testing
.B
) {
296 m
:= make(map[BigKey
]BigVal
)
298 m
[k
] = BigVal
{6, 7, 8}
299 for i
:= 0; i
< b
.N
; i
++ {
304 func BenchmarkSmallKeyMap(b
*testing
.B
) {
305 m
:= make(map[int16]bool)
307 for i
:= 0; i
< b
.N
; i
++ {
312 func BenchmarkMapPopulate(b
*testing
.B
) {
313 for size
:= 1; size
< 1000000; size
*= 10 {
314 b
.Run(strconv
.Itoa(size
), func(b
*testing
.B
) {
316 for i
:= 0; i
< b
.N
; i
++ {
317 m
:= make(map[int]bool)
318 for j
:= 0; j
< size
; j
++ {
326 type ComplexAlgKey
struct {
336 func BenchmarkComplexAlgMap(b
*testing
.B
) {
337 m
:= make(map[ComplexAlgKey
]bool)
340 for i
:= 0; i
< b
.N
; i
++ {