github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/runtime/mapspeed_test.go (about) 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. 4 package runtime_test 5 6 import ( 7 "fmt" 8 "strings" 9 "testing" 10 ) 11 12 const size = 10 13 14 func BenchmarkHashStringSpeed(b *testing.B) { 15 strings := make([]string, size) 16 for i := 0; i < size; i++ { 17 strings[i] = fmt.Sprintf("string#%d", i) 18 } 19 sum := 0 20 m := make(map[string]int, size) 21 for i := 0; i < size; i++ { 22 m[strings[i]] = 0 23 } 24 idx := 0 25 b.ResetTimer() 26 for i := 0; i < b.N; i++ { 27 sum += m[strings[idx]] 28 idx++ 29 if idx == size { 30 idx = 0 31 } 32 } 33 } 34 35 func BenchmarkHashInt32Speed(b *testing.B) { 36 ints := make([]int32, size) 37 for i := 0; i < size; i++ { 38 ints[i] = int32(i) 39 } 40 sum := 0 41 m := make(map[int32]int, size) 42 for i := 0; i < size; i++ { 43 m[ints[i]] = 0 44 } 45 idx := 0 46 b.ResetTimer() 47 for i := 0; i < b.N; i++ { 48 sum += m[ints[idx]] 49 idx++ 50 if idx == size { 51 idx = 0 52 } 53 } 54 } 55 56 func BenchmarkHashInt64Speed(b *testing.B) { 57 ints := make([]int64, size) 58 for i := 0; i < size; i++ { 59 ints[i] = int64(i) 60 } 61 sum := 0 62 m := make(map[int64]int, size) 63 for i := 0; i < size; i++ { 64 m[ints[i]] = 0 65 } 66 idx := 0 67 b.ResetTimer() 68 for i := 0; i < b.N; i++ { 69 sum += m[ints[idx]] 70 idx++ 71 if idx == size { 72 idx = 0 73 } 74 } 75 } 76 func BenchmarkHashStringArraySpeed(b *testing.B) { 77 stringpairs := make([][2]string, size) 78 for i := 0; i < size; i++ { 79 for j := 0; j < 2; j++ { 80 stringpairs[i][j] = fmt.Sprintf("string#%d/%d", i, j) 81 } 82 } 83 sum := 0 84 m := make(map[[2]string]int, size) 85 for i := 0; i < size; i++ { 86 m[stringpairs[i]] = 0 87 } 88 idx := 0 89 b.ResetTimer() 90 for i := 0; i < b.N; i++ { 91 sum += m[stringpairs[idx]] 92 idx++ 93 if idx == size { 94 idx = 0 95 } 96 } 97 } 98 99 func BenchmarkMegMap(b *testing.B) { 100 m := make(map[string]bool) 101 for suffix := 'A'; suffix <= 'G'; suffix++ { 102 m[strings.Repeat("X", 1<<20-1)+fmt.Sprint(suffix)] = true 103 } 104 key := strings.Repeat("X", 1<<20-1) + "k" 105 b.ResetTimer() 106 for i := 0; i < b.N; i++ { 107 _, _ = m[key] 108 } 109 } 110 111 func BenchmarkMegOneMap(b *testing.B) { 112 m := make(map[string]bool) 113 m[strings.Repeat("X", 1<<20)] = true 114 key := strings.Repeat("Y", 1<<20) 115 b.ResetTimer() 116 for i := 0; i < b.N; i++ { 117 _, _ = m[key] 118 } 119 } 120 121 func BenchmarkMegEqMap(b *testing.B) { 122 m := make(map[string]bool) 123 key1 := strings.Repeat("X", 1<<20) 124 key2 := strings.Repeat("X", 1<<20) // equal but different instance 125 m[key1] = true 126 b.ResetTimer() 127 for i := 0; i < b.N; i++ { 128 _, _ = m[key2] 129 } 130 } 131 132 func BenchmarkMegEmptyMap(b *testing.B) { 133 m := make(map[string]bool) 134 key := strings.Repeat("X", 1<<20) 135 b.ResetTimer() 136 for i := 0; i < b.N; i++ { 137 _, _ = m[key] 138 } 139 } 140 141 func BenchmarkSmallStrMap(b *testing.B) { 142 m := make(map[string]bool) 143 for suffix := 'A'; suffix <= 'G'; suffix++ { 144 m[fmt.Sprint(suffix)] = true 145 } 146 key := "k" 147 b.ResetTimer() 148 for i := 0; i < b.N; i++ { 149 _, _ = m[key] 150 } 151 } 152 153 func BenchmarkMapStringKeysEight_16(b *testing.B) { benchmarkMapStringKeysEight(b, 16) } 154 func BenchmarkMapStringKeysEight_32(b *testing.B) { benchmarkMapStringKeysEight(b, 32) } 155 func BenchmarkMapStringKeysEight_64(b *testing.B) { benchmarkMapStringKeysEight(b, 64) } 156 func BenchmarkMapStringKeysEight_1M(b *testing.B) { benchmarkMapStringKeysEight(b, 1<<20) } 157 158 func benchmarkMapStringKeysEight(b *testing.B, keySize int) { 159 m := make(map[string]bool) 160 for i := 0; i < 8; i++ { 161 m[strings.Repeat("K", i+1)] = true 162 } 163 key := strings.Repeat("K", keySize) 164 b.ResetTimer() 165 for i := 0; i < b.N; i++ { 166 _ = m[key] 167 } 168 } 169 170 func BenchmarkIntMap(b *testing.B) { 171 m := make(map[int]bool) 172 for i := 0; i < 8; i++ { 173 m[i] = true 174 } 175 b.ResetTimer() 176 for i := 0; i < b.N; i++ { 177 _, _ = m[7] 178 } 179 } 180 181 // Accessing the same keys in a row. 182 func benchmarkRepeatedLookup(b *testing.B, lookupKeySize int) { 183 m := make(map[string]bool) 184 // At least bigger than a single bucket: 185 for i := 0; i < 64; i++ { 186 m[fmt.Sprintf("some key %d", i)] = true 187 } 188 base := strings.Repeat("x", lookupKeySize-1) 189 key1 := base + "1" 190 key2 := base + "2" 191 b.ResetTimer() 192 for i := 0; i < b.N/4; i++ { 193 _ = m[key1] 194 _ = m[key1] 195 _ = m[key2] 196 _ = m[key2] 197 } 198 } 199 200 func BenchmarkRepeatedLookupStrMapKey32(b *testing.B) { benchmarkRepeatedLookup(b, 32) } 201 func BenchmarkRepeatedLookupStrMapKey1M(b *testing.B) { benchmarkRepeatedLookup(b, 1<<20) } 202 203 func BenchmarkNewEmptyMap(b *testing.B) { 204 b.ReportAllocs() 205 for i := 0; i < b.N; i++ { 206 _ = make(map[int]int) 207 } 208 }