94 lines
2.3 KiB
Go
94 lines
2.3 KiB
Go
package cachekv_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
dbm "github.com/tendermint/tm-db"
|
|
|
|
"github.com/cosmos/cosmos-sdk/store/cachekv"
|
|
"github.com/cosmos/cosmos-sdk/store/dbadapter"
|
|
)
|
|
|
|
var sink interface{}
|
|
|
|
const defaultValueSizeBz = 1 << 12
|
|
|
|
// This benchmark measures the time of iterator.Next() when the parent store is blank
|
|
func benchmarkBlankParentIteratorNext(b *testing.B, keysize int) {
|
|
mem := dbadapter.Store{DB: dbm.NewMemDB()}
|
|
kvstore := cachekv.NewStore(mem)
|
|
// Use a singleton for value, to not waste time computing it
|
|
value := randSlice(defaultValueSizeBz)
|
|
// Use simple values for keys, pick a random start,
|
|
// and take next b.N keys sequentially after.]
|
|
startKey := randSlice(32)
|
|
|
|
// Add 1 to avoid issues when b.N = 1
|
|
keys := generateSequentialKeys(startKey, b.N+1)
|
|
for _, k := range keys {
|
|
kvstore.Set(k, value)
|
|
}
|
|
|
|
b.ReportAllocs()
|
|
b.ResetTimer()
|
|
|
|
iter := kvstore.Iterator(keys[0], keys[b.N])
|
|
defer iter.Close()
|
|
|
|
for _ = iter.Key(); iter.Valid(); iter.Next() {
|
|
// deadcode elimination stub
|
|
sink = iter
|
|
}
|
|
}
|
|
|
|
// Benchmark setting New keys to a store, where the new keys are in sequence.
|
|
func benchmarkBlankParentAppend(b *testing.B, keysize int) {
|
|
mem := dbadapter.Store{DB: dbm.NewMemDB()}
|
|
kvstore := cachekv.NewStore(mem)
|
|
|
|
// Use a singleton for value, to not waste time computing it
|
|
value := randSlice(32)
|
|
// Use simple values for keys, pick a random start,
|
|
// and take next b.N keys sequentially after.
|
|
startKey := randSlice(32)
|
|
|
|
keys := generateSequentialKeys(startKey, b.N)
|
|
|
|
b.ReportAllocs()
|
|
b.ResetTimer()
|
|
|
|
for _, k := range keys {
|
|
kvstore.Set(k, value)
|
|
}
|
|
}
|
|
|
|
// Benchmark setting New keys to a store, where the new keys are random.
|
|
// the speed of this function does not depend on the values in the parent store
|
|
func benchmarkRandomSet(b *testing.B, keysize int) {
|
|
mem := dbadapter.Store{DB: dbm.NewMemDB()}
|
|
kvstore := cachekv.NewStore(mem)
|
|
|
|
// Use a singleton for value, to not waste time computing it
|
|
value := randSlice(defaultValueSizeBz)
|
|
keys := generateRandomKeys(keysize, b.N)
|
|
|
|
b.ReportAllocs()
|
|
b.ResetTimer()
|
|
|
|
for _, k := range keys {
|
|
kvstore.Set(k, value)
|
|
}
|
|
}
|
|
|
|
func BenchmarkBlankParentIteratorNextKeySize32(b *testing.B) {
|
|
benchmarkBlankParentIteratorNext(b, 32)
|
|
}
|
|
|
|
func BenchmarkBlankParentAppendKeySize32(b *testing.B) {
|
|
benchmarkBlankParentAppend(b, 32)
|
|
}
|
|
|
|
func BenchmarkSetKeySize32(b *testing.B) {
|
|
benchmarkRandomSet(b, 32)
|
|
}
|