github.com/cayleygraph/cayley@v0.7.7/graph/memstore/keys_test.go (about)

     1  // Copyright 2014 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package memstore
     6  
     7  import (
     8  	"math"
     9  	"runtime/debug"
    10  	"testing"
    11  
    12  	"github.com/cznic/mathutil"
    13  )
    14  
    15  func rng() *mathutil.FC32 {
    16  	x, err := mathutil.NewFC32(math.MinInt32/4, math.MaxInt32/4, false)
    17  	if err != nil {
    18  		panic(err)
    19  	}
    20  
    21  	return x
    22  }
    23  
    24  func BenchmarkSetSeq1e3(b *testing.B) {
    25  	benchmarkSetSeq(b, 1e3)
    26  }
    27  
    28  func BenchmarkSetSeq1e4(b *testing.B) {
    29  	benchmarkSetSeq(b, 1e4)
    30  }
    31  
    32  func BenchmarkSetSeq1e5(b *testing.B) {
    33  	benchmarkSetSeq(b, 1e5)
    34  }
    35  
    36  func BenchmarkSetSeq1e6(b *testing.B) {
    37  	benchmarkSetSeq(b, 1e6)
    38  }
    39  
    40  func benchmarkSetSeq(b *testing.B, n int) {
    41  	b.ResetTimer()
    42  	for i := 0; i < b.N; i++ {
    43  		b.StopTimer()
    44  		r := TreeNew(cmp)
    45  		debug.FreeOSMemory()
    46  		b.StartTimer()
    47  		for j := int64(0); j < int64(n); j++ {
    48  			r.Set(j, nil)
    49  		}
    50  		b.StopTimer()
    51  		r.Close()
    52  	}
    53  	b.StopTimer()
    54  }
    55  
    56  func BenchmarkGetSeq1e3(b *testing.B) {
    57  	benchmarkGetSeq(b, 1e3)
    58  }
    59  
    60  func BenchmarkGetSeq1e4(b *testing.B) {
    61  	benchmarkGetSeq(b, 1e4)
    62  }
    63  
    64  func BenchmarkGetSeq1e5(b *testing.B) {
    65  	benchmarkGetSeq(b, 1e5)
    66  }
    67  
    68  func BenchmarkGetSeq1e6(b *testing.B) {
    69  	benchmarkGetSeq(b, 1e6)
    70  }
    71  
    72  func benchmarkGetSeq(b *testing.B, n int) {
    73  	r := TreeNew(cmp)
    74  	for i := int64(0); i < int64(n); i++ {
    75  		r.Set(i, nil)
    76  	}
    77  	debug.FreeOSMemory()
    78  	b.ResetTimer()
    79  	for i := 0; i < b.N; i++ {
    80  		for j := int64(0); j < int64(n); j++ {
    81  			r.Get(j)
    82  		}
    83  	}
    84  	b.StopTimer()
    85  	r.Close()
    86  }
    87  
    88  func BenchmarkSetRnd1e3(b *testing.B) {
    89  	benchmarkSetRnd(b, 1e3)
    90  }
    91  
    92  func BenchmarkSetRnd1e4(b *testing.B) {
    93  	benchmarkSetRnd(b, 1e4)
    94  }
    95  
    96  func BenchmarkSetRnd1e5(b *testing.B) {
    97  	benchmarkSetRnd(b, 1e5)
    98  }
    99  
   100  func BenchmarkSetRnd1e6(b *testing.B) {
   101  	benchmarkSetRnd(b, 1e6)
   102  }
   103  
   104  func benchmarkSetRnd(b *testing.B, n int) {
   105  	rng := rng()
   106  	a := make([]int, n)
   107  	for i := range a {
   108  		a[i] = rng.Next()
   109  	}
   110  	b.ResetTimer()
   111  	for i := 0; i < b.N; i++ {
   112  		b.StopTimer()
   113  		r := TreeNew(cmp)
   114  		debug.FreeOSMemory()
   115  		b.StartTimer()
   116  		for _, v := range a {
   117  			r.Set(int64(v), nil)
   118  		}
   119  		b.StopTimer()
   120  		r.Close()
   121  	}
   122  	b.StopTimer()
   123  }
   124  
   125  func BenchmarkGetRnd1e3(b *testing.B) {
   126  	benchmarkGetRnd(b, 1e3)
   127  }
   128  
   129  func BenchmarkGetRnd1e4(b *testing.B) {
   130  	benchmarkGetRnd(b, 1e4)
   131  }
   132  
   133  func BenchmarkGetRnd1e5(b *testing.B) {
   134  	benchmarkGetRnd(b, 1e5)
   135  }
   136  
   137  func BenchmarkGetRnd1e6(b *testing.B) {
   138  	benchmarkGetRnd(b, 1e6)
   139  }
   140  
   141  func benchmarkGetRnd(b *testing.B, n int) {
   142  	r := TreeNew(cmp)
   143  	rng := rng()
   144  	a := make([]int64, n)
   145  	for i := range a {
   146  		a[i] = int64(rng.Next())
   147  	}
   148  	for _, v := range a {
   149  		r.Set(v, nil)
   150  	}
   151  	debug.FreeOSMemory()
   152  	b.ResetTimer()
   153  	for i := 0; i < b.N; i++ {
   154  		for _, v := range a {
   155  			r.Get(v)
   156  		}
   157  	}
   158  	b.StopTimer()
   159  	r.Close()
   160  }
   161  
   162  func BenchmarkDelSeq1e3(b *testing.B) {
   163  	benchmarkDelSeq(b, 1e3)
   164  }
   165  
   166  func BenchmarkDelSeq1e4(b *testing.B) {
   167  	benchmarkDelSeq(b, 1e4)
   168  }
   169  
   170  func BenchmarkDelSeq1e5(b *testing.B) {
   171  	benchmarkDelSeq(b, 1e5)
   172  }
   173  
   174  func BenchmarkDelSeq1e6(b *testing.B) {
   175  	benchmarkDelSeq(b, 1e6)
   176  }
   177  
   178  func benchmarkDelSeq(b *testing.B, n int) {
   179  	b.ResetTimer()
   180  	for i := 0; i < b.N; i++ {
   181  		b.StopTimer()
   182  		r := TreeNew(cmp)
   183  		for j := int64(0); j < int64(n); j++ {
   184  			r.Set(j, nil)
   185  		}
   186  		debug.FreeOSMemory()
   187  		b.StartTimer()
   188  		for j := int64(0); j < int64(n); j++ {
   189  			r.Delete(j)
   190  		}
   191  	}
   192  	b.StopTimer()
   193  }
   194  
   195  func BenchmarkDelRnd1e3(b *testing.B) {
   196  	benchmarkDelRnd(b, 1e3)
   197  }
   198  
   199  func BenchmarkDelRnd1e4(b *testing.B) {
   200  	benchmarkDelRnd(b, 1e4)
   201  }
   202  
   203  func BenchmarkDelRnd1e5(b *testing.B) {
   204  	benchmarkDelRnd(b, 1e5)
   205  }
   206  
   207  func BenchmarkDelRnd1e6(b *testing.B) {
   208  	benchmarkDelRnd(b, 1e6)
   209  }
   210  
   211  func benchmarkDelRnd(b *testing.B, n int) {
   212  	rng := rng()
   213  	a := make([]int64, n)
   214  	for i := range a {
   215  		a[i] = int64(rng.Next())
   216  	}
   217  	b.ResetTimer()
   218  	for i := 0; i < b.N; i++ {
   219  		b.StopTimer()
   220  		r := TreeNew(cmp)
   221  		for _, v := range a {
   222  			r.Set(v, nil)
   223  		}
   224  		debug.FreeOSMemory()
   225  		b.StartTimer()
   226  		for _, v := range a {
   227  			r.Delete(v)
   228  		}
   229  		b.StopTimer()
   230  		r.Close()
   231  	}
   232  	b.StopTimer()
   233  }
   234  
   235  func BenchmarkSeekSeq1e3(b *testing.B) {
   236  	benchmarkSeekSeq(b, 1e3)
   237  }
   238  
   239  func BenchmarkSeekSeq1e4(b *testing.B) {
   240  	benchmarkSeekSeq(b, 1e4)
   241  }
   242  
   243  func BenchmarkSeekSeq1e5(b *testing.B) {
   244  	benchmarkSeekSeq(b, 1e5)
   245  }
   246  
   247  func BenchmarkSeekSeq1e6(b *testing.B) {
   248  	benchmarkSeekSeq(b, 1e6)
   249  }
   250  
   251  func benchmarkSeekSeq(b *testing.B, n int) {
   252  	for i := 0; i < b.N; i++ {
   253  		b.StopTimer()
   254  		t := TreeNew(cmp)
   255  		for j := int64(0); j < int64(n); j++ {
   256  			t.Set(j, nil)
   257  		}
   258  		debug.FreeOSMemory()
   259  		b.StartTimer()
   260  		for j := int64(0); j < int64(n); j++ {
   261  			e, _ := t.Seek(j)
   262  			e.Close()
   263  		}
   264  		b.StopTimer()
   265  		t.Close()
   266  	}
   267  	b.StopTimer()
   268  }
   269  
   270  func BenchmarkSeekRnd1e3(b *testing.B) {
   271  	benchmarkSeekRnd(b, 1e3)
   272  }
   273  
   274  func BenchmarkSeekRnd1e4(b *testing.B) {
   275  	benchmarkSeekRnd(b, 1e4)
   276  }
   277  
   278  func BenchmarkSeekRnd1e5(b *testing.B) {
   279  	benchmarkSeekRnd(b, 1e5)
   280  }
   281  
   282  func BenchmarkSeekRnd1e6(b *testing.B) {
   283  	benchmarkSeekRnd(b, 1e6)
   284  }
   285  
   286  func benchmarkSeekRnd(b *testing.B, n int) {
   287  	r := TreeNew(cmp)
   288  	rng := rng()
   289  	a := make([]int64, n)
   290  	for i := range a {
   291  		a[i] = int64(rng.Next())
   292  	}
   293  	for _, v := range a {
   294  		r.Set(v, nil)
   295  	}
   296  	debug.FreeOSMemory()
   297  	b.ResetTimer()
   298  	for i := 0; i < b.N; i++ {
   299  		for _, v := range a {
   300  			e, _ := r.Seek(v)
   301  			e.Close()
   302  		}
   303  	}
   304  	b.StopTimer()
   305  	r.Close()
   306  }
   307  
   308  func BenchmarkNext1e3(b *testing.B) {
   309  	benchmarkNext(b, 1e3)
   310  }
   311  
   312  func BenchmarkNext1e4(b *testing.B) {
   313  	benchmarkNext(b, 1e4)
   314  }
   315  
   316  func BenchmarkNext1e5(b *testing.B) {
   317  	benchmarkNext(b, 1e5)
   318  }
   319  
   320  func BenchmarkNext1e6(b *testing.B) {
   321  	benchmarkNext(b, 1e6)
   322  }
   323  
   324  func benchmarkNext(b *testing.B, n int) {
   325  	t := TreeNew(cmp)
   326  	for i := int64(0); i < int64(n); i++ {
   327  		t.Set(i, nil)
   328  	}
   329  	debug.FreeOSMemory()
   330  	b.ResetTimer()
   331  	for i := 0; i < b.N; i++ {
   332  		en, err := t.SeekFirst()
   333  		if err != nil {
   334  			b.Fatal(err)
   335  		}
   336  
   337  		m := 0
   338  		for {
   339  			if _, _, err = en.Next(); err != nil {
   340  				break
   341  			}
   342  			m++
   343  		}
   344  		if m != n {
   345  			b.Fatal(m)
   346  		}
   347  	}
   348  	b.StopTimer()
   349  	t.Close()
   350  }
   351  
   352  func BenchmarkPrev1e3(b *testing.B) {
   353  	benchmarkPrev(b, 1e3)
   354  }
   355  
   356  func BenchmarkPrev1e4(b *testing.B) {
   357  	benchmarkPrev(b, 1e4)
   358  }
   359  
   360  func BenchmarkPrev1e5(b *testing.B) {
   361  	benchmarkPrev(b, 1e5)
   362  }
   363  
   364  func BenchmarkPrev1e6(b *testing.B) {
   365  	benchmarkPrev(b, 1e6)
   366  }
   367  
   368  func benchmarkPrev(b *testing.B, n int) {
   369  	t := TreeNew(cmp)
   370  	for i := int64(0); i < int64(n); i++ {
   371  		t.Set(i, nil)
   372  	}
   373  	debug.FreeOSMemory()
   374  	b.ResetTimer()
   375  	for i := 0; i < b.N; i++ {
   376  		en, err := t.SeekLast()
   377  		if err != nil {
   378  			b.Fatal(err)
   379  		}
   380  
   381  		m := 0
   382  		for {
   383  			if _, _, err = en.Prev(); err != nil {
   384  				break
   385  			}
   386  			m++
   387  		}
   388  		if m != n {
   389  			b.Fatal(m)
   390  		}
   391  	}
   392  }