github.com/mhmtszr/concurrent-swiss-map@v1.0.8/concurrent_swiss_map_benchmark_test.go (about) 1 //nolint:all 2 package csmap_test 3 4 // import ( 5 // "fmt" 6 // "runtime" 7 // "strconv" 8 // "sync" 9 // "testing" 10 // 11 // "github.com/mhmtszr/concurrent-swiss-map" 12 //) 13 // 14 15 // var table = []struct { 16 // total int 17 // deletion int 18 // }{ 19 // { 20 // total: 100, 21 // deletion: 100, 22 // }, 23 // { 24 // total: 5000000, 25 // deletion: 5000000, 26 // }, 27 //} 28 29 // func PrintMemUsage() { 30 // var m runtime.MemStats 31 // runtime.ReadMemStats(&m) 32 // // For info on each, see: https://golang.org/pkg/runtime/#MemStats 33 // fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc)) 34 // fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc)) 35 // fmt.Printf("\tSys = %v MiB", bToMb(m.Sys)) 36 // fmt.Printf("\tNumGC = %v\n", m.NumGC) 37 //} 38 // 39 // func bToMb(b uint64) uint64 { 40 // return b / 1024 / 1024 41 //} 42 43 // func BenchmarkConcurrentSwissMapGoMaxProcs1(b *testing.B) { 44 // runtime.GOMAXPROCS(1) 45 // debug.SetGCPercent(-1) 46 // debug.SetMemoryLimit(math.MaxInt64) 47 // for _, v := range table { 48 // b.Run(fmt.Sprintf("total: %d deletion: %d", v.total, v.deletion), func(b *testing.B) { 49 // for i := 0; i < b.N; i++ { 50 // m1 := csmap.Create[int, string]() 51 // var wg sync.WaitGroup 52 // wg.Add(3) 53 // go func() { 54 // defer wg.Done() 55 // var wg2 sync.WaitGroup 56 // wg2.Add(v.total) 57 // for i := 0; i < v.total; i++ { 58 // i := i 59 // go func() { 60 // defer wg2.Done() 61 // m1.Store(i, strconv.Itoa(i)) 62 // }() 63 // } 64 // wg2.Wait() 65 // }() 66 // 67 // go func() { 68 // defer wg.Done() 69 // var wg2 sync.WaitGroup 70 // wg2.Add(v.total) 71 // for i := 0; i < v.total; i++ { 72 // i := i 73 // go func() { 74 // defer wg2.Done() 75 // m1.Store(i, strconv.Itoa(i)) 76 // }() 77 // } 78 // wg2.Wait() 79 // }() 80 // 81 // go func() { 82 // defer wg.Done() 83 // var wg2 sync.WaitGroup 84 // wg2.Add(v.total) 85 // for i := 0; i < v.total; i++ { 86 // i := i 87 // go func() { 88 // defer wg2.Done() 89 // m1.Store(10, strconv.Itoa(i)) 90 // m1.Delete(10) 91 // }() 92 // } 93 // wg2.Wait() 94 // }() 95 // wg.Wait() 96 // 97 // wg.Add(v.deletion + v.total) 98 // for i := 0; i < v.deletion; i++ { 99 // i := i 100 // go func() { 101 // defer wg.Done() 102 // m1.Delete(i) 103 // }() 104 // } 105 // 106 // for i := 0; i < v.total; i++ { 107 // i := i 108 // go func() { 109 // defer wg.Done() 110 // m1.Load(i) 111 // }() 112 // } 113 // wg.Wait() 114 // } 115 // }) 116 // } 117 // PrintMemUsage() 118 //} 119 120 // func BenchmarkSyncMapGoMaxProcs1(b *testing.B) { 121 // runtime.GOMAXPROCS(1) 122 // debug.SetGCPercent(-1) 123 // debug.SetMemoryLimit(math.MaxInt64) 124 // for _, v := range table { 125 // b.Run(fmt.Sprintf("total: %d deletion: %d", v.total, v.deletion), func(b *testing.B) { 126 // for i := 0; i < b.N; i++ { 127 // var m1 sync.Map 128 // var wg sync.WaitGroup 129 // wg.Add(3) 130 // go func() { 131 // defer wg.Done() 132 // var wg2 sync.WaitGroup 133 // wg2.Add(v.total) 134 // for i := 0; i < v.total; i++ { 135 // i := i 136 // go func() { 137 // defer wg2.Done() 138 // m1.Store(i, strconv.Itoa(i)) 139 // }() 140 // } 141 // wg2.Wait() 142 // }() 143 // 144 // go func() { 145 // defer wg.Done() 146 // var wg2 sync.WaitGroup 147 // wg2.Add(v.total) 148 // for i := 0; i < v.total; i++ { 149 // i := i 150 // go func() { 151 // defer wg2.Done() 152 // m1.Store(i, strconv.Itoa(i)) 153 // }() 154 // } 155 // wg2.Wait() 156 // }() 157 // 158 // go func() { 159 // defer wg.Done() 160 // var wg2 sync.WaitGroup 161 // wg2.Add(v.total) 162 // for i := 0; i < v.total; i++ { 163 // i := i 164 // go func() { 165 // defer wg2.Done() 166 // m1.Store(10, strconv.Itoa(i)) 167 // m1.Delete(10) 168 // }() 169 // } 170 // wg2.Wait() 171 // }() 172 // wg.Wait() 173 // 174 // wg.Add(v.deletion + v.total) 175 // for i := 0; i < v.deletion; i++ { 176 // i := i 177 // go func() { 178 // defer wg.Done() 179 // m1.Delete(i) 180 // }() 181 // } 182 // 183 // for i := 0; i < v.total; i++ { 184 // i := i 185 // go func() { 186 // defer wg.Done() 187 // m1.Load(i) 188 // }() 189 // } 190 // wg.Wait() 191 // } 192 // }) 193 // } 194 // PrintMemUsage() 195 //} 196 197 // func BenchmarkRWMutexMapGoMaxProcs1(b *testing.B) { 198 // runtime.GOMAXPROCS(1) 199 // debug.SetGCPercent(-1) 200 // debug.SetMemoryLimit(math.MaxInt64) 201 // for _, v := range table { 202 // b.Run(fmt.Sprintf("total: %d deletion: %d", v.total, v.deletion), func(b *testing.B) { 203 // for i := 0; i < b.N; i++ { 204 // m1 := CreateTestRWMutexMap() 205 // var wg sync.WaitGroup 206 // wg.Add(3) 207 // go func() { 208 // defer wg.Done() 209 // var wg2 sync.WaitGroup 210 // wg2.Add(v.total) 211 // for i := 0; i < v.total; i++ { 212 // i := i 213 // go func() { 214 // defer wg2.Done() 215 // m1.Store(i, strconv.Itoa(i)) 216 // }() 217 // } 218 // wg2.Wait() 219 // }() 220 // 221 // go func() { 222 // defer wg.Done() 223 // var wg2 sync.WaitGroup 224 // wg2.Add(v.total) 225 // for i := 0; i < v.total; i++ { 226 // i := i 227 // go func() { 228 // defer wg2.Done() 229 // m1.Store(i, strconv.Itoa(i)) 230 // }() 231 // } 232 // wg2.Wait() 233 // }() 234 // 235 // go func() { 236 // defer wg.Done() 237 // var wg2 sync.WaitGroup 238 // wg2.Add(v.total) 239 // for i := 0; i < v.total; i++ { 240 // i := i 241 // go func() { 242 // defer wg2.Done() 243 // m1.Store(10, strconv.Itoa(i)) 244 // m1.Delete(10) 245 // }() 246 // } 247 // wg2.Wait() 248 // }() 249 // wg.Wait() 250 // 251 // wg.Add(v.deletion + v.total) 252 // for i := 0; i < v.deletion; i++ { 253 // i := i 254 // go func() { 255 // defer wg.Done() 256 // m1.Delete(i) 257 // }() 258 // } 259 // 260 // for i := 0; i < v.total; i++ { 261 // i := i 262 // go func() { 263 // defer wg.Done() 264 // m1.Load(i) 265 // }() 266 // } 267 // wg.Wait() 268 // } 269 // }) 270 // } 271 // PrintMemUsage() 272 //} 273 274 // func BenchmarkConcurrentSwissMapGoMaxProcsCore(b *testing.B) { 275 // debug.SetGCPercent(-1) 276 // debug.SetMemoryLimit(math.MaxInt64) 277 // for _, v := range table { 278 // b.Run(fmt.Sprintf("total: %d deletion: %d", v.total, v.deletion), func(b *testing.B) { 279 // for i := 0; i < b.N; i++ { 280 // m1 := csmap.Create[int, string]() 281 // var wg sync.WaitGroup 282 // wg.Add(3) 283 // go func() { 284 // defer wg.Done() 285 // var wg2 sync.WaitGroup 286 // wg2.Add(v.total) 287 // for i := 0; i < v.total; i++ { 288 // i := i 289 // go func() { 290 // defer wg2.Done() 291 // m1.Store(i, strconv.Itoa(i)) 292 // }() 293 // } 294 // wg2.Wait() 295 // }() 296 // 297 // go func() { 298 // defer wg.Done() 299 // var wg2 sync.WaitGroup 300 // wg2.Add(v.total) 301 // for i := 0; i < v.total; i++ { 302 // i := i 303 // go func() { 304 // defer wg2.Done() 305 // m1.Store(i, strconv.Itoa(i)) 306 // }() 307 // } 308 // wg2.Wait() 309 // }() 310 // 311 // go func() { 312 // defer wg.Done() 313 // var wg2 sync.WaitGroup 314 // wg2.Add(v.total) 315 // for i := 0; i < v.total; i++ { 316 // i := i 317 // go func() { 318 // defer wg2.Done() 319 // m1.Store(10, strconv.Itoa(i)) 320 // m1.Delete(10) 321 // }() 322 // } 323 // wg2.Wait() 324 // }() 325 // wg.Wait() 326 // 327 // wg.Add(v.deletion + v.total) 328 // for i := 0; i < v.deletion; i++ { 329 // i := i 330 // go func() { 331 // defer wg.Done() 332 // m1.Delete(i) 333 // }() 334 // } 335 // 336 // for i := 0; i < v.total; i++ { 337 // i := i 338 // go func() { 339 // defer wg.Done() 340 // m1.Load(i) 341 // }() 342 // } 343 // wg.Wait() 344 // } 345 // }) 346 // } 347 // PrintMemUsage() 348 //} 349 350 // func BenchmarkSyncMapGoMaxProcsCore(b *testing.B) { 351 // debug.SetGCPercent(-1) 352 // debug.SetMemoryLimit(math.MaxInt64) 353 // for _, v := range table { 354 // b.Run(fmt.Sprintf("total: %d deletion: %d", v.total, v.deletion), func(b *testing.B) { 355 // for i := 0; i < b.N; i++ { 356 // var m1 sync.Map 357 // var wg sync.WaitGroup 358 // wg.Add(3) 359 // go func() { 360 // defer wg.Done() 361 // var wg2 sync.WaitGroup 362 // wg2.Add(v.total) 363 // for i := 0; i < v.total; i++ { 364 // i := i 365 // go func() { 366 // defer wg2.Done() 367 // m1.Store(i, strconv.Itoa(i)) 368 // }() 369 // } 370 // wg2.Wait() 371 // }() 372 // 373 // go func() { 374 // defer wg.Done() 375 // var wg2 sync.WaitGroup 376 // wg2.Add(v.total) 377 // for i := 0; i < v.total; i++ { 378 // i := i 379 // go func() { 380 // defer wg2.Done() 381 // m1.Store(i, strconv.Itoa(i)) 382 // }() 383 // } 384 // wg2.Wait() 385 // }() 386 // 387 // go func() { 388 // defer wg.Done() 389 // var wg2 sync.WaitGroup 390 // wg2.Add(v.total) 391 // for i := 0; i < v.total; i++ { 392 // i := i 393 // go func() { 394 // defer wg2.Done() 395 // m1.Store(10, strconv.Itoa(i)) 396 // m1.Delete(10) 397 // }() 398 // } 399 // wg2.Wait() 400 // }() 401 // wg.Wait() 402 // 403 // wg.Add(v.deletion + v.total) 404 // for i := 0; i < v.deletion; i++ { 405 // i := i 406 // go func() { 407 // defer wg.Done() 408 // m1.Delete(i) 409 // }() 410 // } 411 // 412 // for i := 0; i < v.total; i++ { 413 // i := i 414 // go func() { 415 // defer wg.Done() 416 // m1.Load(i) 417 // }() 418 // } 419 // wg.Wait() 420 // } 421 // }) 422 // } 423 // PrintMemUsage() 424 //} 425 426 // func BenchmarkRWMutexMapGoMaxProcsCore(b *testing.B) { 427 // debug.SetGCPercent(-1) 428 // debug.SetMemoryLimit(math.MaxInt64) 429 // for _, v := range table { 430 // b.Run(fmt.Sprintf("total: %d deletion: %d", v.total, v.deletion), func(b *testing.B) { 431 // for i := 0; i < b.N; i++ { 432 // m1 := CreateTestRWMutexMap() 433 // var wg sync.WaitGroup 434 // wg.Add(3) 435 // go func() { 436 // defer wg.Done() 437 // var wg2 sync.WaitGroup 438 // wg2.Add(v.total) 439 // for i := 0; i < v.total; i++ { 440 // i := i 441 // go func() { 442 // defer wg2.Done() 443 // m1.Store(i, strconv.Itoa(i)) 444 // }() 445 // } 446 // wg2.Wait() 447 // }() 448 // 449 // go func() { 450 // defer wg.Done() 451 // var wg2 sync.WaitGroup 452 // wg2.Add(v.total) 453 // for i := 0; i < v.total; i++ { 454 // i := i 455 // go func() { 456 // defer wg2.Done() 457 // m1.Store(i, strconv.Itoa(i)) 458 // }() 459 // } 460 // wg2.Wait() 461 // }() 462 // 463 // go func() { 464 // defer wg.Done() 465 // var wg2 sync.WaitGroup 466 // wg2.Add(v.total) 467 // for i := 0; i < v.total; i++ { 468 // i := i 469 // go func() { 470 // defer wg2.Done() 471 // m1.Store(10, strconv.Itoa(i)) 472 // m1.Delete(10) 473 // }() 474 // } 475 // wg2.Wait() 476 // }() 477 // wg.Wait() 478 // 479 // wg.Add(v.deletion + v.total) 480 // for i := 0; i < v.deletion; i++ { 481 // i := i 482 // go func() { 483 // defer wg.Done() 484 // m1.Delete(i) 485 // }() 486 // } 487 // 488 // for i := 0; i < v.total; i++ { 489 // i := i 490 // go func() { 491 // defer wg.Done() 492 // m1.Load(i) 493 // }() 494 // } 495 // wg.Wait() 496 // } 497 // }) 498 // } 499 // PrintMemUsage() 500 //} 501 502 // type TestRWMutexMap struct { 503 // m map[int]string 504 // sync.RWMutex 505 //} 506 // 507 // func CreateTestRWMutexMap() *TestRWMutexMap { 508 // return &TestRWMutexMap{ 509 // m: make(map[int]string), 510 // } 511 //} 512 // 513 // func (m *TestRWMutexMap) Store(key int, value string) { 514 // m.Lock() 515 // defer m.Unlock() 516 // m.m[key] = value 517 //} 518 // 519 // func (m *TestRWMutexMap) Delete(key int) { 520 // m.Lock() 521 // defer m.Unlock() 522 // delete(m.m, key) 523 //} 524 // 525 // func (m *TestRWMutexMap) Load(key int) *string { 526 // m.RLock() 527 // defer m.RUnlock() 528 // s, ok := m.m[key] 529 // if !ok { 530 // return nil 531 // } 532 // return &s 533 //}