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  }