github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/data/cache/fastcache/fastcache_timing_test.go (about) 1 package fastcache 2 3 import ( 4 "fmt" 5 "sync" 6 "testing" 7 ) 8 9 func BenchmarkCacheSet(b *testing.B) { 10 const items = 1 << 16 11 c := New(12 * items) 12 defer c.Reset() 13 b.ReportAllocs() 14 b.SetBytes(items) 15 b.RunParallel(func(pb *testing.PB) { 16 k := []byte("\x00\x00\x00\x00") 17 v := []byte("xyza") 18 for pb.Next() { 19 for i := 0; i < items; i++ { 20 k[0]++ 21 if k[0] == 0 { 22 k[1]++ 23 } 24 c.Set(k, v) 25 } 26 } 27 }) 28 } 29 30 func BenchmarkCacheGet(b *testing.B) { 31 const items = 1 << 16 32 c := New(12 * items) 33 defer c.Reset() 34 k := []byte("\x00\x00\x00\x00") 35 v := []byte("xyza") 36 for i := 0; i < items; i++ { 37 k[0]++ 38 if k[0] == 0 { 39 k[1]++ 40 } 41 c.Set(k, v) 42 } 43 44 b.ReportAllocs() 45 b.SetBytes(items) 46 b.RunParallel(func(pb *testing.PB) { 47 var buf []byte 48 k := []byte("\x00\x00\x00\x00") 49 for pb.Next() { 50 for i := 0; i < items; i++ { 51 k[0]++ 52 if k[0] == 0 { 53 k[1]++ 54 } 55 buf = c.Get(buf[:0], k) 56 if string(buf) != string(v) { 57 panic(fmt.Errorf("BUG: invalid value obtained; got %q; want %q", buf, v)) 58 } 59 } 60 } 61 }) 62 } 63 64 func BenchmarkCacheHas(b *testing.B) { 65 const items = 1 << 16 66 c := New(12 * items) 67 defer c.Reset() 68 k := []byte("\x00\x00\x00\x00") 69 for i := 0; i < items; i++ { 70 k[0]++ 71 if k[0] == 0 { 72 k[1]++ 73 } 74 c.Set(k, nil) 75 } 76 77 b.ReportAllocs() 78 b.SetBytes(items) 79 b.RunParallel(func(pb *testing.PB) { 80 k := []byte("\x00\x00\x00\x00") 81 for pb.Next() { 82 for i := 0; i < items; i++ { 83 k[0]++ 84 if k[0] == 0 { 85 k[1]++ 86 } 87 if !c.Has(k) { 88 panic(fmt.Errorf("BUG: missing value for key %q", k)) 89 } 90 } 91 } 92 }) 93 } 94 95 func BenchmarkCacheSetGet(b *testing.B) { 96 const items = 1 << 16 97 c := New(12 * items) 98 defer c.Reset() 99 b.ReportAllocs() 100 b.SetBytes(2 * items) 101 b.RunParallel(func(pb *testing.PB) { 102 k := []byte("\x00\x00\x00\x00") 103 v := []byte("xyza") 104 var buf []byte 105 for pb.Next() { 106 for i := 0; i < items; i++ { 107 k[0]++ 108 if k[0] == 0 { 109 k[1]++ 110 } 111 c.Set(k, v) 112 } 113 for i := 0; i < items; i++ { 114 k[0]++ 115 if k[0] == 0 { 116 k[1]++ 117 } 118 buf = c.Get(buf[:0], k) 119 if string(buf) != string(v) { 120 panic(fmt.Errorf("BUG: invalid value obtained; got %q; want %q", buf, v)) 121 } 122 } 123 } 124 }) 125 } 126 127 func BenchmarkStdMapSet(b *testing.B) { 128 const items = 1 << 16 129 m := make(map[string][]byte) 130 var mu sync.Mutex 131 b.ReportAllocs() 132 b.SetBytes(items) 133 b.RunParallel(func(pb *testing.PB) { 134 k := []byte("\x00\x00\x00\x00") 135 v := []byte("xyza") 136 for pb.Next() { 137 for i := 0; i < items; i++ { 138 k[0]++ 139 if k[0] == 0 { 140 k[1]++ 141 } 142 mu.Lock() 143 m[string(k)] = v 144 mu.Unlock() 145 } 146 } 147 }) 148 } 149 150 func BenchmarkStdMapGet(b *testing.B) { 151 const items = 1 << 16 152 m := make(map[string][]byte) 153 k := []byte("\x00\x00\x00\x00") 154 v := []byte("xyza") 155 for i := 0; i < items; i++ { 156 k[0]++ 157 if k[0] == 0 { 158 k[1]++ 159 } 160 m[string(k)] = v 161 } 162 163 var mu sync.RWMutex 164 b.ReportAllocs() 165 b.SetBytes(items) 166 b.RunParallel(func(pb *testing.PB) { 167 k := []byte("\x00\x00\x00\x00") 168 for pb.Next() { 169 for i := 0; i < items; i++ { 170 k[0]++ 171 if k[0] == 0 { 172 k[1]++ 173 } 174 mu.RLock() 175 vv := m[string(k)] 176 mu.RUnlock() 177 if string(vv) != string(v) { 178 panic(fmt.Errorf("BUG: unexpected value; got %q; want %q", vv, v)) 179 } 180 } 181 } 182 }) 183 } 184 185 func BenchmarkStdMapSetGet(b *testing.B) { 186 const items = 1 << 16 187 m := make(map[string][]byte) 188 var mu sync.RWMutex 189 b.ReportAllocs() 190 b.SetBytes(2 * items) 191 b.RunParallel(func(pb *testing.PB) { 192 k := []byte("\x00\x00\x00\x00") 193 v := []byte("xyza") 194 for pb.Next() { 195 for i := 0; i < items; i++ { 196 k[0]++ 197 if k[0] == 0 { 198 k[1]++ 199 } 200 mu.Lock() 201 m[string(k)] = v 202 mu.Unlock() 203 } 204 for i := 0; i < items; i++ { 205 k[0]++ 206 if k[0] == 0 { 207 k[1]++ 208 } 209 mu.RLock() 210 vv := m[string(k)] 211 mu.RUnlock() 212 if string(vv) != string(v) { 213 panic(fmt.Errorf("BUG: unexpected value; got %q; want %q", vv, v)) 214 } 215 } 216 } 217 }) 218 } 219 220 func BenchmarkSyncMapSet(b *testing.B) { 221 const items = 1 << 16 222 m := sync.Map{} 223 b.ReportAllocs() 224 b.SetBytes(items) 225 b.RunParallel(func(pb *testing.PB) { 226 k := []byte("\x00\x00\x00\x00") 227 v := "xyza" 228 for pb.Next() { 229 for i := 0; i < items; i++ { 230 k[0]++ 231 if k[0] == 0 { 232 k[1]++ 233 } 234 m.Store(string(k), v) 235 } 236 } 237 }) 238 } 239 240 func BenchmarkSyncMapGet(b *testing.B) { 241 const items = 1 << 16 242 m := sync.Map{} 243 k := []byte("\x00\x00\x00\x00") 244 v := "xyza" 245 for i := 0; i < items; i++ { 246 k[0]++ 247 if k[0] == 0 { 248 k[1]++ 249 } 250 m.Store(string(k), v) 251 } 252 253 b.ReportAllocs() 254 b.SetBytes(items) 255 b.RunParallel(func(pb *testing.PB) { 256 k := []byte("\x00\x00\x00\x00") 257 for pb.Next() { 258 for i := 0; i < items; i++ { 259 k[0]++ 260 if k[0] == 0 { 261 k[1]++ 262 } 263 vv, ok := m.Load(string(k)) 264 if !ok || vv.(string) != string(v) { 265 panic(fmt.Errorf("BUG: unexpected value; got %q; want %q", vv, v)) 266 } 267 } 268 } 269 }) 270 } 271 272 func BenchmarkSyncMapSetGet(b *testing.B) { 273 const items = 1 << 16 274 m := sync.Map{} 275 b.ReportAllocs() 276 b.SetBytes(2 * items) 277 b.RunParallel(func(pb *testing.PB) { 278 k := []byte("\x00\x00\x00\x00") 279 v := "xyza" 280 for pb.Next() { 281 for i := 0; i < items; i++ { 282 k[0]++ 283 if k[0] == 0 { 284 k[1]++ 285 } 286 m.Store(string(k), v) 287 } 288 for i := 0; i < items; i++ { 289 k[0]++ 290 if k[0] == 0 { 291 k[1]++ 292 } 293 vv, ok := m.Load(string(k)) 294 if !ok || vv.(string) != string(v) { 295 panic(fmt.Errorf("BUG: unexpected value; got %q; want %q", vv, v)) 296 } 297 } 298 } 299 }) 300 }