Files
zeekayandHanzo Dev c6c6cc6219 Go 1.27.1, and the code it can say more simply
The module declares go 1.27.1 and CI follows. go fix applied the
modernizers; omitzero is not applied, since it changes what the JSON
says.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-16 19:52:34 -07:00

205 lines
5.1 KiB
Go

// Copyright (C) 2020-2025, Lux Industries Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package dbtest
import (
"math/rand"
"testing"
"github.com/stretchr/testify/require"
"github.com/luxfi/database"
)
var (
// Benchmarks is a list of all database benchmarks
Benchmarks = map[string]func(b *testing.B, db database.Database, keys, values [][]byte){
"Get": BenchmarkGet,
"Put": BenchmarkPut,
"Delete": BenchmarkDelete,
"BatchPut": BenchmarkBatchPut,
"BatchDelete": BenchmarkBatchDelete,
"BatchWrite": BenchmarkBatchWrite,
"ParallelGet": BenchmarkParallelGet,
"ParallelPut": BenchmarkParallelPut,
"ParallelDelete": BenchmarkParallelDelete,
}
// BenchmarkSizes to use with each benchmark
BenchmarkSizes = [][]int{
// count, keySize, valueSize
{1024, 32, 32},
{1024, 256, 256},
{1024, 2 * KiB, 2 * KiB},
}
)
// Writes size data into the db in order to setup reads in subsequent tests.
func SetupBenchmark(b *testing.B, count int, keySize, valueSize int) ([][]byte, [][]byte) {
require := require.New(b)
b.Helper()
keys := make([][]byte, count)
values := make([][]byte, count)
for i := range count {
keyBytes := make([]byte, keySize)
valueBytes := make([]byte, valueSize)
_, err := rand.Read(keyBytes) // #nosec G404
require.NoError(err)
_, err = rand.Read(valueBytes) // #nosec G404
require.NoError(err)
keys[i], values[i] = keyBytes, valueBytes
}
return keys, values
}
// BenchmarkGet measures the time it takes to get an operation from a database.
func BenchmarkGet(b *testing.B, db database.Database, keys, values [][]byte) {
require.NotEmpty(b, keys)
count := len(keys)
require := require.New(b)
for i, key := range keys {
value := values[i]
require.NoError(db.Put(key, value))
}
b.ResetTimer()
// Reads b.N values from the db
for i := 0; i < b.N; i++ {
_, err := db.Get(keys[i%count])
require.NoError(err)
}
}
// BenchmarkPut measures the time it takes to write an operation to a database.
func BenchmarkPut(b *testing.B, db database.Database, keys, values [][]byte) {
require.NotEmpty(b, keys)
count := len(keys)
// Writes b.N values to the db
for i := 0; i < b.N; i++ {
require.NoError(b, db.Put(keys[i%count], values[i%count]))
}
}
// BenchmarkDelete measures the time it takes to delete a (k, v) from a database.
func BenchmarkDelete(b *testing.B, db database.Database, keys, values [][]byte) {
require.NotEmpty(b, keys)
count := len(keys)
require := require.New(b)
// Writes random values of size _size_ to the database
for i, key := range keys {
value := values[i]
require.NoError(db.Put(key, value))
}
b.ResetTimer()
// Deletes b.N values from the db
for i := 0; i < b.N; i++ {
require.NoError(db.Delete(keys[i%count]))
}
}
// BenchmarkBatchPut measures the time it takes to batch put.
func BenchmarkBatchPut(b *testing.B, db database.Database, keys, values [][]byte) {
require.NotEmpty(b, keys)
count := len(keys)
batch := db.NewBatch()
for i := 0; i < b.N; i++ {
require.NoError(b, batch.Put(keys[i%count], values[i%count]))
}
}
// BenchmarkBatchDelete measures the time it takes to batch delete.
func BenchmarkBatchDelete(b *testing.B, db database.Database, keys, _ [][]byte) {
require.NotEmpty(b, keys)
count := len(keys)
batch := db.NewBatch()
for i := 0; i < b.N; i++ {
require.NoError(b, batch.Delete(keys[i%count]))
}
}
// BenchmarkBatchWrite measures the time it takes to batch write.
func BenchmarkBatchWrite(b *testing.B, db database.Database, keys, values [][]byte) {
require.NotEmpty(b, keys)
require := require.New(b)
batch := db.NewBatch()
for i, key := range keys {
value := values[i]
require.NoError(batch.Put(key, value))
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
require.NoError(batch.Write())
}
}
// BenchmarkParallelGet measures the time it takes to read in parallel.
func BenchmarkParallelGet(b *testing.B, db database.Database, keys, values [][]byte) {
require.NotEmpty(b, keys)
count := len(keys)
require := require.New(b)
for i, key := range keys {
value := values[i]
require.NoError(db.Put(key, value))
}
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
for i := 0; pb.Next(); i++ {
_, err := db.Get(keys[i%count])
require.NoError(err)
}
})
}
// BenchmarkParallelPut measures the time it takes to write to the db in parallel.
func BenchmarkParallelPut(b *testing.B, db database.Database, keys, values [][]byte) {
require.NotEmpty(b, keys)
count := len(keys)
b.RunParallel(func(pb *testing.PB) {
// Write N values to the db
for i := 0; pb.Next(); i++ {
require.NoError(b, db.Put(keys[i%count], values[i%count]))
}
})
}
// BenchmarkParallelDelete measures the time it takes to delete a (k, v) from the database.
func BenchmarkParallelDelete(b *testing.B, db database.Database, keys, values [][]byte) {
require.NotEmpty(b, keys)
count := len(keys)
require := require.New(b)
for i, key := range keys {
value := values[i]
require.NoError(db.Put(key, value))
}
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
// Deletes b.N values from the db
for i := 0; pb.Next(); i++ {
require.NoError(db.Delete(keys[i%count]))
}
})
}