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  //}