Files
bl/common/utils/concurrent-swiss-map/concurrent_swiss_map_benchmark_test.go

534 lines
11 KiB
Go

//nolint:all
package csmap_test
// import (
// "fmt"
// "runtime"
// "strconv"
// "sync"
// "testing"
//
// "github.com/mhmtszr/concurrent-swiss-map"
//)
//
// var table = []struct {
// total int
// deletion int
// }{
// {
// total: 100,
// deletion: 100,
// },
// {
// total: 5000000,
// deletion: 5000000,
// },
//}
// func PrintMemUsage() {
// var m runtime.MemStats
// runtime.ReadMemStats(&m)
// // For info on each, see: https://golang.org/pkg/runtime/#MemStats
// fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))
// fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
// fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
// fmt.Printf("\tNumGC = %v\n", m.NumGC)
//}
//
// func bToMb(b uint64) uint64 {
// return b / 1024 / 1024
//}
// func BenchmarkConcurrentSwissMapGoMaxProcs1(b *testing.B) {
// runtime.GOMAXPROCS(1)
// debug.SetGCPercent(-1)
// debug.SetMemoryLimit(math.MaxInt64)
// for _, v := range table {
// b.Run(fmt.Sprintf("total: %d deletion: %d", v.total, v.deletion), func(b *testing.B) {
// for i := 0; i < b.N; i++ {
// m1 := csmap.Create[int, string]()
// var wg sync.WaitGroup
// wg.Add(3)
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(i, strconv.Itoa(i))
// }()
// }
// wg2.Wait()
// }()
//
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(i, strconv.Itoa(i))
// }()
// }
// wg2.Wait()
// }()
//
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(10, strconv.Itoa(i))
// m1.Delete(10)
// }()
// }
// wg2.Wait()
// }()
// wg.Wait()
//
// wg.Add(v.deletion + v.total)
// for i := 0; i < v.deletion; i++ {
// i := i
// go func() {
// defer wg.Done()
// m1.Delete(i)
// }()
// }
//
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg.Done()
// m1.Load(i)
// }()
// }
// wg.Wait()
// }
// })
// }
// PrintMemUsage()
//}
// func BenchmarkSyncMapGoMaxProcs1(b *testing.B) {
// runtime.GOMAXPROCS(1)
// debug.SetGCPercent(-1)
// debug.SetMemoryLimit(math.MaxInt64)
// for _, v := range table {
// b.Run(fmt.Sprintf("total: %d deletion: %d", v.total, v.deletion), func(b *testing.B) {
// for i := 0; i < b.N; i++ {
// var m1 sync.Map
// var wg sync.WaitGroup
// wg.Add(3)
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(i, strconv.Itoa(i))
// }()
// }
// wg2.Wait()
// }()
//
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(i, strconv.Itoa(i))
// }()
// }
// wg2.Wait()
// }()
//
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(10, strconv.Itoa(i))
// m1.Delete(10)
// }()
// }
// wg2.Wait()
// }()
// wg.Wait()
//
// wg.Add(v.deletion + v.total)
// for i := 0; i < v.deletion; i++ {
// i := i
// go func() {
// defer wg.Done()
// m1.Delete(i)
// }()
// }
//
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg.Done()
// m1.Load(i)
// }()
// }
// wg.Wait()
// }
// })
// }
// PrintMemUsage()
//}
// func BenchmarkRWMutexMapGoMaxProcs1(b *testing.B) {
// runtime.GOMAXPROCS(1)
// debug.SetGCPercent(-1)
// debug.SetMemoryLimit(math.MaxInt64)
// for _, v := range table {
// b.Run(fmt.Sprintf("total: %d deletion: %d", v.total, v.deletion), func(b *testing.B) {
// for i := 0; i < b.N; i++ {
// m1 := CreateTestRWMutexMap()
// var wg sync.WaitGroup
// wg.Add(3)
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(i, strconv.Itoa(i))
// }()
// }
// wg2.Wait()
// }()
//
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(i, strconv.Itoa(i))
// }()
// }
// wg2.Wait()
// }()
//
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(10, strconv.Itoa(i))
// m1.Delete(10)
// }()
// }
// wg2.Wait()
// }()
// wg.Wait()
//
// wg.Add(v.deletion + v.total)
// for i := 0; i < v.deletion; i++ {
// i := i
// go func() {
// defer wg.Done()
// m1.Delete(i)
// }()
// }
//
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg.Done()
// m1.Load(i)
// }()
// }
// wg.Wait()
// }
// })
// }
// PrintMemUsage()
//}
// func BenchmarkConcurrentSwissMapGoMaxProcsCore(b *testing.B) {
// debug.SetGCPercent(-1)
// debug.SetMemoryLimit(math.MaxInt64)
// for _, v := range table {
// b.Run(fmt.Sprintf("total: %d deletion: %d", v.total, v.deletion), func(b *testing.B) {
// for i := 0; i < b.N; i++ {
// m1 := csmap.Create[int, string]()
// var wg sync.WaitGroup
// wg.Add(3)
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(i, strconv.Itoa(i))
// }()
// }
// wg2.Wait()
// }()
//
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(i, strconv.Itoa(i))
// }()
// }
// wg2.Wait()
// }()
//
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(10, strconv.Itoa(i))
// m1.Delete(10)
// }()
// }
// wg2.Wait()
// }()
// wg.Wait()
//
// wg.Add(v.deletion + v.total)
// for i := 0; i < v.deletion; i++ {
// i := i
// go func() {
// defer wg.Done()
// m1.Delete(i)
// }()
// }
//
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg.Done()
// m1.Load(i)
// }()
// }
// wg.Wait()
// }
// })
// }
// PrintMemUsage()
//}
// func BenchmarkSyncMapGoMaxProcsCore(b *testing.B) {
// debug.SetGCPercent(-1)
// debug.SetMemoryLimit(math.MaxInt64)
// for _, v := range table {
// b.Run(fmt.Sprintf("total: %d deletion: %d", v.total, v.deletion), func(b *testing.B) {
// for i := 0; i < b.N; i++ {
// var m1 sync.Map
// var wg sync.WaitGroup
// wg.Add(3)
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(i, strconv.Itoa(i))
// }()
// }
// wg2.Wait()
// }()
//
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(i, strconv.Itoa(i))
// }()
// }
// wg2.Wait()
// }()
//
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(10, strconv.Itoa(i))
// m1.Delete(10)
// }()
// }
// wg2.Wait()
// }()
// wg.Wait()
//
// wg.Add(v.deletion + v.total)
// for i := 0; i < v.deletion; i++ {
// i := i
// go func() {
// defer wg.Done()
// m1.Delete(i)
// }()
// }
//
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg.Done()
// m1.Load(i)
// }()
// }
// wg.Wait()
// }
// })
// }
// PrintMemUsage()
//}
// func BenchmarkRWMutexMapGoMaxProcsCore(b *testing.B) {
// debug.SetGCPercent(-1)
// debug.SetMemoryLimit(math.MaxInt64)
// for _, v := range table {
// b.Run(fmt.Sprintf("total: %d deletion: %d", v.total, v.deletion), func(b *testing.B) {
// for i := 0; i < b.N; i++ {
// m1 := CreateTestRWMutexMap()
// var wg sync.WaitGroup
// wg.Add(3)
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(i, strconv.Itoa(i))
// }()
// }
// wg2.Wait()
// }()
//
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(i, strconv.Itoa(i))
// }()
// }
// wg2.Wait()
// }()
//
// go func() {
// defer wg.Done()
// var wg2 sync.WaitGroup
// wg2.Add(v.total)
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg2.Done()
// m1.Store(10, strconv.Itoa(i))
// m1.Delete(10)
// }()
// }
// wg2.Wait()
// }()
// wg.Wait()
//
// wg.Add(v.deletion + v.total)
// for i := 0; i < v.deletion; i++ {
// i := i
// go func() {
// defer wg.Done()
// m1.Delete(i)
// }()
// }
//
// for i := 0; i < v.total; i++ {
// i := i
// go func() {
// defer wg.Done()
// m1.Load(i)
// }()
// }
// wg.Wait()
// }
// })
// }
// PrintMemUsage()
//}
// type TestRWMutexMap struct {
// m map[int]string
// sync.RWMutex
//}
//
// func CreateTestRWMutexMap() *TestRWMutexMap {
// return &TestRWMutexMap{
// m: make(map[int]string),
// }
//}
//
// func (m *TestRWMutexMap) Store(key int, value string) {
// m.Lock()
// defer m.Unlock()
// m.m[key] = value
//}
//
// func (m *TestRWMutexMap) Delete(key int) {
// m.Lock()
// defer m.Unlock()
// delete(m.m, key)
//}
//
// func (m *TestRWMutexMap) Load(key int) *string {
// m.RLock()
// defer m.RUnlock()
// s, ok := m.m[key]
// if !ok {
// return nil
// }
// return &s
//}