github.com/vescale/zgraph@v0.0.0-20230410094002-959c02d50f95/storage/memdb_bench_test.go (about) 1 // Copyright 2022 zGraph Authors. All rights reserved. 2 // 3 // Copyright 2020 PingCAP, Inc. 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 17 package storage 18 19 import ( 20 "context" 21 "encoding/binary" 22 "math/rand" 23 "testing" 24 ) 25 26 const ( 27 keySize = 16 28 valueSize = 128 29 ) 30 31 func BenchmarkLargeIndex(b *testing.B) { 32 buf := make([][valueSize]byte, 10000000) 33 for i := range buf { 34 binary.LittleEndian.PutUint32(buf[i][:], uint32(i)) 35 } 36 db := newMemDB() 37 b.ResetTimer() 38 39 for i := range buf { 40 db.Set(buf[i][:keySize], buf[i][:]) 41 } 42 } 43 44 func BenchmarkPut(b *testing.B) { 45 buf := make([][valueSize]byte, b.N) 46 for i := range buf { 47 binary.BigEndian.PutUint32(buf[i][:], uint32(i)) 48 } 49 50 p := newMemDB() 51 b.ResetTimer() 52 53 for i := range buf { 54 p.Set(buf[i][:keySize], buf[i][:]) 55 } 56 } 57 58 func BenchmarkPutRandom(b *testing.B) { 59 buf := make([][valueSize]byte, b.N) 60 for i := range buf { 61 binary.LittleEndian.PutUint32(buf[i][:], uint32(rand.Int())) 62 } 63 64 p := newMemDB() 65 b.ResetTimer() 66 67 for i := range buf { 68 p.Set(buf[i][:keySize], buf[i][:]) 69 } 70 } 71 72 func BenchmarkGet(b *testing.B) { 73 buf := make([][valueSize]byte, b.N) 74 for i := range buf { 75 binary.BigEndian.PutUint32(buf[i][:], uint32(i)) 76 } 77 78 p := newMemDB() 79 for i := range buf { 80 p.Set(buf[i][:keySize], buf[i][:]) 81 } 82 83 b.ResetTimer() 84 for i := range buf { 85 p.Get(context.Background(), buf[i][:keySize]) 86 } 87 } 88 89 func BenchmarkGetRandom(b *testing.B) { 90 buf := make([][valueSize]byte, b.N) 91 for i := range buf { 92 binary.LittleEndian.PutUint32(buf[i][:], uint32(rand.Int())) 93 } 94 95 p := newMemDB() 96 for i := range buf { 97 p.Set(buf[i][:keySize], buf[i][:]) 98 } 99 100 b.ResetTimer() 101 for i := 0; i < b.N; i++ { 102 p.Get(context.Background(), buf[i][:keySize]) 103 } 104 } 105 106 var opCnt = 100000 107 108 func BenchmarkMemDbBufferSequential(b *testing.B) { 109 data := make([][]byte, opCnt) 110 for i := 0; i < opCnt; i++ { 111 data[i] = encodeInt(i) 112 } 113 buffer := newMemDB() 114 benchmarkSetGet(b, buffer, data) 115 b.ReportAllocs() 116 } 117 118 func BenchmarkMemDbBufferRandom(b *testing.B) { 119 data := make([][]byte, opCnt) 120 for i := 0; i < opCnt; i++ { 121 data[i] = encodeInt(i) 122 } 123 shuffle(data) 124 buffer := newMemDB() 125 benchmarkSetGet(b, buffer, data) 126 b.ReportAllocs() 127 } 128 129 func BenchmarkMemDbIter(b *testing.B) { 130 buffer := newMemDB() 131 benchIterator(b, buffer) 132 b.ReportAllocs() 133 } 134 135 func BenchmarkMemDbCreation(b *testing.B) { 136 for i := 0; i < b.N; i++ { 137 newMemDB() 138 } 139 b.ReportAllocs() 140 } 141 142 func shuffle(slc [][]byte) { 143 N := len(slc) 144 for i := 0; i < N; i++ { 145 // choose index uniformly in [i, N-1] 146 r := i + rand.Intn(N-i) 147 slc[r], slc[i] = slc[i], slc[r] 148 } 149 } 150 func benchmarkSetGet(b *testing.B, buffer *MemDB, data [][]byte) { 151 b.ResetTimer() 152 for i := 0; i < b.N; i++ { 153 for _, k := range data { 154 buffer.Set(k, k) 155 } 156 for _, k := range data { 157 buffer.Get(context.Background(), k) 158 } 159 } 160 } 161 162 func benchIterator(b *testing.B, buffer *MemDB) { 163 for k := 0; k < opCnt; k++ { 164 buffer.Set(encodeInt(k), encodeInt(k)) 165 } 166 b.ResetTimer() 167 for i := 0; i < b.N; i++ { 168 iter, err := buffer.Iter(nil, nil) 169 if err != nil { 170 b.Error(err) 171 } 172 for iter.Valid() { 173 iter.Next() 174 } 175 iter.Close() 176 } 177 }