github.com/easierway/concurrent_map@v1.0.0/map_benchmark_test.go (about)

     1  package concurrent_map
     2  
     3  import (
     4  	"strconv"
     5  	"sync"
     6  	"testing"
     7  )
     8  
     9  type Map interface {
    10  	Set(key interface{}, val interface{})
    11  	Get(key interface{}) (interface{}, bool)
    12  	Del(key interface{})
    13  }
    14  
    15  func benchmarkMap(b *testing.B, hm Map) {
    16  	for i := 0; i < b.N; i++ {
    17  		var wg sync.WaitGroup
    18  		for i := 0; i < 100; i++ {
    19  			wg.Add(1)
    20  			go func() {
    21  				for i := 0; i < 100000; i++ {
    22  					hm.Set(strconv.Itoa(i), i*i)
    23  					hm.Set(strconv.Itoa(i), i*i)
    24  					hm.Del(strconv.Itoa(i))
    25  				}
    26  				wg.Done()
    27  			}()
    28  		}
    29  		for i := 0; i < 100; i++ {
    30  			wg.Add(1)
    31  			go func() {
    32  				for i := 0; i < 100000; i++ {
    33  					hm.Get(strconv.Itoa(i))
    34  				}
    35  				wg.Done()
    36  			}()
    37  		}
    38  		wg.Wait()
    39  	}
    40  }
    41  
    42  func BenchmarkSyncmap(b *testing.B) {
    43  	b.Run("map with RWLock", func(b *testing.B) {
    44  		hm := CreateRWLockMap()
    45  		benchmarkMap(b, hm)
    46  	})
    47  
    48  	b.Run("sync.map", func(b *testing.B) {
    49  		hm := CreateSyncMapBenchmarkAdapter()
    50  		benchmarkMap(b, hm)
    51  	})
    52  
    53  	b.Run("concurrent map", func(b *testing.B) {
    54  		superman := CreateConcurrentMapBenchmarkAdapter(199)
    55  		benchmarkMap(b, superman)
    56  	})
    57  }