github.com/bytom/bytom@v1.1.2-0.20221014091027-bbcba3df6075/database/leveldb/go_level_db_test.go (about) 1 package leveldb 2 3 import ( 4 "bytes" 5 "encoding/binary" 6 "fmt" 7 "testing" 8 9 . "github.com/tendermint/tmlibs/common" 10 ) 11 12 func BenchmarkRandomReadsWrites(b *testing.B) { 13 b.StopTimer() 14 15 numItems := int64(1000000) 16 internal := map[int64]int64{} 17 for i := 0; i < int(numItems); i++ { 18 internal[int64(i)] = int64(0) 19 } 20 db, err := NewGoLevelDB(Fmt("test_%x", RandStr(12)), "") 21 if err != nil { 22 b.Fatal(err.Error()) 23 return 24 } 25 26 fmt.Println("ok, starting") 27 b.StartTimer() 28 29 for i := 0; i < b.N; i++ { 30 // Write something 31 { 32 idx := (int64(RandInt()) % numItems) 33 internal[idx]++ 34 val := internal[idx] 35 idxBytes := int642Bytes(int64(idx)) 36 valBytes := int642Bytes(int64(val)) 37 //fmt.Printf("Set %X -> %X\n", idxBytes, valBytes) 38 db.Set( 39 idxBytes, 40 valBytes, 41 ) 42 } 43 // Read something 44 { 45 idx := (int64(RandInt()) % numItems) 46 val := internal[idx] 47 idxBytes := int642Bytes(int64(idx)) 48 valBytes := db.Get(idxBytes) 49 //fmt.Printf("Get %X -> %X\n", idxBytes, valBytes) 50 if val == 0 { 51 if !bytes.Equal(valBytes, nil) { 52 b.Errorf("Expected %v for %v, got %X", 53 nil, idx, valBytes) 54 break 55 } 56 } else { 57 if len(valBytes) != 8 { 58 b.Errorf("Expected length 8 for %v, got %X", 59 idx, valBytes) 60 break 61 } 62 valGot := bytes2Int64(valBytes) 63 if val != valGot { 64 b.Errorf("Expected %v for %v, got %v", 65 val, idx, valGot) 66 break 67 } 68 } 69 } 70 } 71 72 db.Close() 73 } 74 75 func int642Bytes(i int64) []byte { 76 buf := make([]byte, 8) 77 binary.BigEndian.PutUint64(buf, uint64(i)) 78 return buf 79 } 80 81 func bytes2Int64(buf []byte) int64 { 82 return int64(binary.BigEndian.Uint64(buf)) 83 }