github.com/nibnait/go-learn@v0.0.0-20220227013611-dfa47ea6d2da/src/test/chapter/ch9/02_maps/map_benchmark_test.go (about) 1 package maps 2 3 import ( 4 "strconv" 5 "sync" 6 "testing" 7 ) 8 9 const ( 10 NumOfReader = 100 11 NumOfWriter = 10 12 ) 13 14 type Map interface { 15 Set(key interface{}, val interface{}) 16 Get(key interface{}) (interface{}, bool) 17 Del(key interface{}) 18 } 19 20 func benchmarkMap(b *testing.B, hm Map) { 21 for i := 0; i < b.N; i++ { 22 var wg sync.WaitGroup 23 for i := 0; i < NumOfWriter; i++ { 24 wg.Add(1) 25 go func() { 26 for i := 0; i < 100; i++ { 27 hm.Set(strconv.Itoa(i), i*i) 28 hm.Set(strconv.Itoa(i), i*i) 29 hm.Del(strconv.Itoa(i)) 30 } 31 wg.Done() 32 }() 33 } 34 for i := 0; i < NumOfReader; i++ { 35 wg.Add(1) 36 go func() { 37 for i := 0; i < 100; i++ { 38 hm.Get(strconv.Itoa(i)) 39 } 40 wg.Done() 41 }() 42 } 43 wg.Wait() 44 } 45 } 46 47 func BenchmarkSyncmap(b *testing.B) { 48 b.Run("map with RWLock", func(b *testing.B) { 49 hm := CreateRWLockMap() 50 benchmarkMap(b, hm) 51 }) 52 53 b.Run("sync.map", func(b *testing.B) { 54 hm := CreateSyncMapBenchmarkAdapter() 55 benchmarkMap(b, hm) 56 }) 57 58 b.Run("concurrent map", func(b *testing.B) { 59 superman := CreateConcurrentMapBenchmarkAdapter(199) 60 benchmarkMap(b, superman) 61 }) 62 }