github.com/scottcagno/storage@v1.8.0/pkg/lsmt/lsmtree_bench_test.go (about) 1 package lsmt 2 3 import ( 4 "fmt" 5 "github.com/scottcagno/storage/pkg/lsmt/sstable" 6 "os" 7 "testing" 8 ) 9 10 func _makeKey(i int) string { 11 return fmt.Sprintf("key-%06d", i) 12 } 13 14 func _makeVal(i int) []byte { 15 return []byte(fmt.Sprintf("value-%08d", i)) 16 } 17 18 func lsmTreeWrite(b *testing.B, db *LSMTree, count int) { 19 20 // write Entries 21 for i := 0; i < count; i++ { 22 err := db.Put(makeKey(i), makeVal(i)) 23 if err != nil { 24 b.Errorf("put: %v\n", err) 25 } 26 } 27 } 28 29 func lsmTreeRead(b *testing.B, db *LSMTree, count int) { 30 31 // used to "catch" value 32 var vv interface{} 33 34 // read Entries 35 for i := 0; i < count; i++ { 36 v, err := db.Get(makeKey(i)) 37 if err != nil { 38 if err == sstable.ErrSSTIndexNotFound { 39 continue 40 } 41 b.Errorf("get: %v\n", err) 42 } 43 vv = v 44 _ = vv 45 } 46 } 47 48 func lsmTreeRemove(b *testing.B, db *LSMTree, count int) { 49 50 // remove Entries 51 for i := 0; i < count; i++ { 52 err := db.Del(makeKey(i)) 53 if err != nil { 54 b.Errorf("del: %v\n", err) 55 } 56 } 57 } 58 59 func setup(b *testing.B) *LSMTree { 60 61 // open 62 db, err := OpenLSMTree(conf) 63 if err != nil { 64 b.Errorf("open: %v\n", err) 65 } 66 67 // return db 68 return db 69 } 70 71 func teardown(b *testing.B, db *LSMTree, shouldClean bool) { 72 73 // close 74 err := db.Close() 75 if err != nil { 76 b.Errorf("close: %v\n", err) 77 } 78 79 // check cleanup 80 if shouldClean { 81 err = os.RemoveAll(db.conf.BaseDir) 82 if err != nil { 83 b.Fatalf("got error: %v\n", err) 84 } 85 } 86 } 87 88 func Bench_LSMTree_Write(b *testing.B, db *LSMTree, count int) { 89 90 // reset measurements 91 reset(b) 92 93 // test write 94 for i := 0; i < b.N; i++ { 95 b.Run("lsmTreeWrite", func(b *testing.B) { 96 lsmTreeWrite(b, db, count) 97 }) 98 } 99 } 100 101 func Bench_LSMTree_Read(b *testing.B, db *LSMTree, count int) { 102 103 // reset measurements 104 reset(b) 105 106 // test read 107 for i := 0; i < b.N; i++ { 108 b.Run("lsmTreeRead", func(b *testing.B) { 109 lsmTreeRead(b, db, count) 110 }) 111 } 112 } 113 114 func BenchmarkLSMTree(b *testing.B) { 115 116 // count 117 count := 10 118 119 // setup (OPEN DB) 120 db := setup(b) 121 122 // writing 123 Bench_LSMTree_Write(b, db, count) 124 125 // reading 126 Bench_LSMTree_Read(b, db, count) 127 128 // teardown (CLOSE DB) 129 teardown(b, db, false) 130 } 131 132 func reset(b *testing.B) { 133 b.ResetTimer() 134 b.ReportAllocs() 135 }