github.com/pingcap/badger@v1.5.1-0.20230103063557-828f39b09b6d/cache/sketch_test.go (about) 1 package cache 2 3 import ( 4 "testing" 5 ) 6 7 func TestSketch(t *testing.T) { 8 defer func() { 9 if r := recover(); r == nil { 10 t.Fatal("no panic with bad param numCounters") 11 } 12 }() 13 s := newCmSketch(5) 14 if s.mask != 7 { 15 t.Fatal("not rounding up to next power of 2") 16 } 17 newCmSketch(0) 18 } 19 20 func TestSketchIncrement(t *testing.T) { 21 s := newCmSketch(16) 22 s.Increment(1) 23 s.Increment(5) 24 s.Increment(9) 25 for i := 0; i < cmDepth; i++ { 26 if s.rows[i].string() != s.rows[0].string() { 27 break 28 } 29 if i == cmDepth-1 { 30 t.Fatal("identical rows, bad seeding") 31 } 32 } 33 } 34 35 func TestSketchEstimate(t *testing.T) { 36 s := newCmSketch(16) 37 s.Increment(1) 38 s.Increment(1) 39 if s.Estimate(1) != 2 { 40 t.Fatal("estimate should be 2") 41 } 42 if s.Estimate(0) != 0 { 43 t.Fatal("estimate should be 0") 44 } 45 } 46 47 func TestSketchReset(t *testing.T) { 48 s := newCmSketch(16) 49 s.Increment(1) 50 s.Increment(1) 51 s.Increment(1) 52 s.Increment(1) 53 s.Reset() 54 if s.Estimate(1) != 2 { 55 t.Fatal("reset failed, estimate should be 2") 56 } 57 } 58 59 func TestSketchClear(t *testing.T) { 60 s := newCmSketch(16) 61 for i := 0; i < 16; i++ { 62 s.Increment(uint64(i)) 63 } 64 s.Clear() 65 for i := 0; i < 16; i++ { 66 if s.Estimate(uint64(i)) != 0 { 67 t.Fatal("clear failed") 68 } 69 } 70 } 71 72 func BenchmarkSketchIncrement(b *testing.B) { 73 s := newCmSketch(16) 74 b.SetBytes(1) 75 for n := 0; n < b.N; n++ { 76 s.Increment(1) 77 } 78 } 79 80 func BenchmarkSketchEstimate(b *testing.B) { 81 s := newCmSketch(16) 82 s.Increment(1) 83 b.SetBytes(1) 84 for n := 0; n < b.N; n++ { 85 s.Estimate(1) 86 } 87 }