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 }