github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/data/cache/fastcache/fastcache_timing_test.go (about)

     1  package fastcache
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  	"testing"
     7  )
     8  
     9  func BenchmarkCacheSet(b *testing.B) {
    10  	const items = 1 << 16
    11  	c := New(12 * items)
    12  	defer c.Reset()
    13  	b.ReportAllocs()
    14  	b.SetBytes(items)
    15  	b.RunParallel(func(pb *testing.PB) {
    16  		k := []byte("\x00\x00\x00\x00")
    17  		v := []byte("xyza")
    18  		for pb.Next() {
    19  			for i := 0; i < items; i++ {
    20  				k[0]++
    21  				if k[0] == 0 {
    22  					k[1]++
    23  				}
    24  				c.Set(k, v)
    25  			}
    26  		}
    27  	})
    28  }
    29  
    30  func BenchmarkCacheGet(b *testing.B) {
    31  	const items = 1 << 16
    32  	c := New(12 * items)
    33  	defer c.Reset()
    34  	k := []byte("\x00\x00\x00\x00")
    35  	v := []byte("xyza")
    36  	for i := 0; i < items; i++ {
    37  		k[0]++
    38  		if k[0] == 0 {
    39  			k[1]++
    40  		}
    41  		c.Set(k, v)
    42  	}
    43  
    44  	b.ReportAllocs()
    45  	b.SetBytes(items)
    46  	b.RunParallel(func(pb *testing.PB) {
    47  		var buf []byte
    48  		k := []byte("\x00\x00\x00\x00")
    49  		for pb.Next() {
    50  			for i := 0; i < items; i++ {
    51  				k[0]++
    52  				if k[0] == 0 {
    53  					k[1]++
    54  				}
    55  				buf = c.Get(buf[:0], k)
    56  				if string(buf) != string(v) {
    57  					panic(fmt.Errorf("BUG: invalid value obtained; got %q; want %q", buf, v))
    58  				}
    59  			}
    60  		}
    61  	})
    62  }
    63  
    64  func BenchmarkCacheHas(b *testing.B) {
    65  	const items = 1 << 16
    66  	c := New(12 * items)
    67  	defer c.Reset()
    68  	k := []byte("\x00\x00\x00\x00")
    69  	for i := 0; i < items; i++ {
    70  		k[0]++
    71  		if k[0] == 0 {
    72  			k[1]++
    73  		}
    74  		c.Set(k, nil)
    75  	}
    76  
    77  	b.ReportAllocs()
    78  	b.SetBytes(items)
    79  	b.RunParallel(func(pb *testing.PB) {
    80  		k := []byte("\x00\x00\x00\x00")
    81  		for pb.Next() {
    82  			for i := 0; i < items; i++ {
    83  				k[0]++
    84  				if k[0] == 0 {
    85  					k[1]++
    86  				}
    87  				if !c.Has(k) {
    88  					panic(fmt.Errorf("BUG: missing value for key %q", k))
    89  				}
    90  			}
    91  		}
    92  	})
    93  }
    94  
    95  func BenchmarkCacheSetGet(b *testing.B) {
    96  	const items = 1 << 16
    97  	c := New(12 * items)
    98  	defer c.Reset()
    99  	b.ReportAllocs()
   100  	b.SetBytes(2 * items)
   101  	b.RunParallel(func(pb *testing.PB) {
   102  		k := []byte("\x00\x00\x00\x00")
   103  		v := []byte("xyza")
   104  		var buf []byte
   105  		for pb.Next() {
   106  			for i := 0; i < items; i++ {
   107  				k[0]++
   108  				if k[0] == 0 {
   109  					k[1]++
   110  				}
   111  				c.Set(k, v)
   112  			}
   113  			for i := 0; i < items; i++ {
   114  				k[0]++
   115  				if k[0] == 0 {
   116  					k[1]++
   117  				}
   118  				buf = c.Get(buf[:0], k)
   119  				if string(buf) != string(v) {
   120  					panic(fmt.Errorf("BUG: invalid value obtained; got %q; want %q", buf, v))
   121  				}
   122  			}
   123  		}
   124  	})
   125  }
   126  
   127  func BenchmarkStdMapSet(b *testing.B) {
   128  	const items = 1 << 16
   129  	m := make(map[string][]byte)
   130  	var mu sync.Mutex
   131  	b.ReportAllocs()
   132  	b.SetBytes(items)
   133  	b.RunParallel(func(pb *testing.PB) {
   134  		k := []byte("\x00\x00\x00\x00")
   135  		v := []byte("xyza")
   136  		for pb.Next() {
   137  			for i := 0; i < items; i++ {
   138  				k[0]++
   139  				if k[0] == 0 {
   140  					k[1]++
   141  				}
   142  				mu.Lock()
   143  				m[string(k)] = v
   144  				mu.Unlock()
   145  			}
   146  		}
   147  	})
   148  }
   149  
   150  func BenchmarkStdMapGet(b *testing.B) {
   151  	const items = 1 << 16
   152  	m := make(map[string][]byte)
   153  	k := []byte("\x00\x00\x00\x00")
   154  	v := []byte("xyza")
   155  	for i := 0; i < items; i++ {
   156  		k[0]++
   157  		if k[0] == 0 {
   158  			k[1]++
   159  		}
   160  		m[string(k)] = v
   161  	}
   162  
   163  	var mu sync.RWMutex
   164  	b.ReportAllocs()
   165  	b.SetBytes(items)
   166  	b.RunParallel(func(pb *testing.PB) {
   167  		k := []byte("\x00\x00\x00\x00")
   168  		for pb.Next() {
   169  			for i := 0; i < items; i++ {
   170  				k[0]++
   171  				if k[0] == 0 {
   172  					k[1]++
   173  				}
   174  				mu.RLock()
   175  				vv := m[string(k)]
   176  				mu.RUnlock()
   177  				if string(vv) != string(v) {
   178  					panic(fmt.Errorf("BUG: unexpected value; got %q; want %q", vv, v))
   179  				}
   180  			}
   181  		}
   182  	})
   183  }
   184  
   185  func BenchmarkStdMapSetGet(b *testing.B) {
   186  	const items = 1 << 16
   187  	m := make(map[string][]byte)
   188  	var mu sync.RWMutex
   189  	b.ReportAllocs()
   190  	b.SetBytes(2 * items)
   191  	b.RunParallel(func(pb *testing.PB) {
   192  		k := []byte("\x00\x00\x00\x00")
   193  		v := []byte("xyza")
   194  		for pb.Next() {
   195  			for i := 0; i < items; i++ {
   196  				k[0]++
   197  				if k[0] == 0 {
   198  					k[1]++
   199  				}
   200  				mu.Lock()
   201  				m[string(k)] = v
   202  				mu.Unlock()
   203  			}
   204  			for i := 0; i < items; i++ {
   205  				k[0]++
   206  				if k[0] == 0 {
   207  					k[1]++
   208  				}
   209  				mu.RLock()
   210  				vv := m[string(k)]
   211  				mu.RUnlock()
   212  				if string(vv) != string(v) {
   213  					panic(fmt.Errorf("BUG: unexpected value; got %q; want %q", vv, v))
   214  				}
   215  			}
   216  		}
   217  	})
   218  }
   219  
   220  func BenchmarkSyncMapSet(b *testing.B) {
   221  	const items = 1 << 16
   222  	m := sync.Map{}
   223  	b.ReportAllocs()
   224  	b.SetBytes(items)
   225  	b.RunParallel(func(pb *testing.PB) {
   226  		k := []byte("\x00\x00\x00\x00")
   227  		v := "xyza"
   228  		for pb.Next() {
   229  			for i := 0; i < items; i++ {
   230  				k[0]++
   231  				if k[0] == 0 {
   232  					k[1]++
   233  				}
   234  				m.Store(string(k), v)
   235  			}
   236  		}
   237  	})
   238  }
   239  
   240  func BenchmarkSyncMapGet(b *testing.B) {
   241  	const items = 1 << 16
   242  	m := sync.Map{}
   243  	k := []byte("\x00\x00\x00\x00")
   244  	v := "xyza"
   245  	for i := 0; i < items; i++ {
   246  		k[0]++
   247  		if k[0] == 0 {
   248  			k[1]++
   249  		}
   250  		m.Store(string(k), v)
   251  	}
   252  
   253  	b.ReportAllocs()
   254  	b.SetBytes(items)
   255  	b.RunParallel(func(pb *testing.PB) {
   256  		k := []byte("\x00\x00\x00\x00")
   257  		for pb.Next() {
   258  			for i := 0; i < items; i++ {
   259  				k[0]++
   260  				if k[0] == 0 {
   261  					k[1]++
   262  				}
   263  				vv, ok := m.Load(string(k))
   264  				if !ok || vv.(string) != string(v) {
   265  					panic(fmt.Errorf("BUG: unexpected value; got %q; want %q", vv, v))
   266  				}
   267  			}
   268  		}
   269  	})
   270  }
   271  
   272  func BenchmarkSyncMapSetGet(b *testing.B) {
   273  	const items = 1 << 16
   274  	m := sync.Map{}
   275  	b.ReportAllocs()
   276  	b.SetBytes(2 * items)
   277  	b.RunParallel(func(pb *testing.PB) {
   278  		k := []byte("\x00\x00\x00\x00")
   279  		v := "xyza"
   280  		for pb.Next() {
   281  			for i := 0; i < items; i++ {
   282  				k[0]++
   283  				if k[0] == 0 {
   284  					k[1]++
   285  				}
   286  				m.Store(string(k), v)
   287  			}
   288  			for i := 0; i < items; i++ {
   289  				k[0]++
   290  				if k[0] == 0 {
   291  					k[1]++
   292  				}
   293  				vv, ok := m.Load(string(k))
   294  				if !ok || vv.(string) != string(v) {
   295  					panic(fmt.Errorf("BUG: unexpected value; got %q; want %q", vv, v))
   296  				}
   297  			}
   298  		}
   299  	})
   300  }