2026-03-30 16:33:07 +00:00
|
|
|
// SPDX-License-Identifier: EUPL-1.2
|
2026-02-20 04:53:52 +00:00
|
|
|
package store
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"testing"
|
2026-03-26 13:58:50 +00:00
|
|
|
|
|
|
|
|
core "dappco.re/go/core"
|
2026-02-20 04:53:52 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Supplemental benchmarks beyond the core Set/Get/GetAll/FileBacked benchmarks
|
|
|
|
|
// in store_test.go. These add: varying group sizes, parallel throughput,
|
|
|
|
|
// Count on large groups, and Delete throughput.
|
|
|
|
|
|
|
|
|
|
func BenchmarkGetAll_VaryingSize(b *testing.B) {
|
|
|
|
|
sizes := []int{10, 100, 1_000, 10_000}
|
|
|
|
|
|
|
|
|
|
for _, size := range sizes {
|
2026-03-26 13:58:50 +00:00
|
|
|
b.Run(core.Sprintf("size=%d", size), func(b *testing.B) {
|
2026-03-30 18:17:07 +00:00
|
|
|
storeInstance, err := New(":memory:")
|
2026-02-20 04:53:52 +00:00
|
|
|
if err != nil {
|
|
|
|
|
b.Fatal(err)
|
|
|
|
|
}
|
2026-03-30 18:17:07 +00:00
|
|
|
defer storeInstance.Close()
|
2026-02-20 04:53:52 +00:00
|
|
|
|
|
|
|
|
for i := range size {
|
2026-03-30 18:17:07 +00:00
|
|
|
_ = storeInstance.Set("bench", core.Sprintf("key-%d", i), "value")
|
2026-02-20 04:53:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
b.ResetTimer()
|
|
|
|
|
|
|
|
|
|
for range b.N {
|
2026-03-30 18:17:07 +00:00
|
|
|
_, _ = storeInstance.GetAll("bench")
|
2026-02-20 04:53:52 +00:00
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkSetGet_Parallel(b *testing.B) {
|
2026-03-30 18:17:07 +00:00
|
|
|
storeInstance, err := New(":memory:")
|
2026-02-20 04:53:52 +00:00
|
|
|
if err != nil {
|
|
|
|
|
b.Fatal(err)
|
|
|
|
|
}
|
2026-03-30 18:17:07 +00:00
|
|
|
defer storeInstance.Close()
|
2026-02-20 04:53:52 +00:00
|
|
|
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
b.ResetTimer()
|
|
|
|
|
|
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
|
|
|
i := 0
|
|
|
|
|
for pb.Next() {
|
2026-03-26 13:58:50 +00:00
|
|
|
key := core.Sprintf("key-%d", i)
|
2026-03-30 18:17:07 +00:00
|
|
|
_ = storeInstance.Set("parallel", key, "value")
|
|
|
|
|
_, _ = storeInstance.Get("parallel", key)
|
2026-02-20 04:53:52 +00:00
|
|
|
i++
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkCount_10K(b *testing.B) {
|
2026-03-30 18:17:07 +00:00
|
|
|
storeInstance, err := New(":memory:")
|
2026-02-20 04:53:52 +00:00
|
|
|
if err != nil {
|
|
|
|
|
b.Fatal(err)
|
|
|
|
|
}
|
2026-03-30 18:17:07 +00:00
|
|
|
defer storeInstance.Close()
|
2026-02-20 04:53:52 +00:00
|
|
|
|
|
|
|
|
for i := range 10_000 {
|
2026-03-30 18:17:07 +00:00
|
|
|
_ = storeInstance.Set("bench", core.Sprintf("key-%d", i), "value")
|
2026-02-20 04:53:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
b.ResetTimer()
|
|
|
|
|
|
|
|
|
|
for range b.N {
|
2026-03-30 18:17:07 +00:00
|
|
|
_, _ = storeInstance.Count("bench")
|
2026-02-20 04:53:52 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkDelete(b *testing.B) {
|
2026-03-30 18:17:07 +00:00
|
|
|
storeInstance, err := New(":memory:")
|
2026-02-20 04:53:52 +00:00
|
|
|
if err != nil {
|
|
|
|
|
b.Fatal(err)
|
|
|
|
|
}
|
2026-03-30 18:17:07 +00:00
|
|
|
defer storeInstance.Close()
|
2026-02-20 04:53:52 +00:00
|
|
|
|
|
|
|
|
// Pre-populate keys that will be deleted.
|
|
|
|
|
for i := range b.N {
|
2026-03-30 18:17:07 +00:00
|
|
|
_ = storeInstance.Set("bench", core.Sprintf("key-%d", i), "value")
|
2026-02-20 04:53:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
b.ResetTimer()
|
|
|
|
|
|
|
|
|
|
for i := range b.N {
|
2026-03-30 18:17:07 +00:00
|
|
|
_ = storeInstance.Delete("bench", core.Sprintf("key-%d", i))
|
2026-02-20 04:53:52 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkSetWithTTL(b *testing.B) {
|
2026-03-30 18:17:07 +00:00
|
|
|
storeInstance, err := New(":memory:")
|
2026-02-20 04:53:52 +00:00
|
|
|
if err != nil {
|
|
|
|
|
b.Fatal(err)
|
|
|
|
|
}
|
2026-03-30 18:17:07 +00:00
|
|
|
defer storeInstance.Close()
|
2026-02-20 04:53:52 +00:00
|
|
|
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
b.ResetTimer()
|
|
|
|
|
|
|
|
|
|
for i := range b.N {
|
2026-03-30 18:17:07 +00:00
|
|
|
_ = storeInstance.SetWithTTL("bench", core.Sprintf("key-%d", i), "value", 60_000_000_000) // 60s
|
2026-02-20 04:53:52 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkRender(b *testing.B) {
|
2026-03-30 18:17:07 +00:00
|
|
|
storeInstance, err := New(":memory:")
|
2026-02-20 04:53:52 +00:00
|
|
|
if err != nil {
|
|
|
|
|
b.Fatal(err)
|
|
|
|
|
}
|
2026-03-30 18:17:07 +00:00
|
|
|
defer storeInstance.Close()
|
2026-02-20 04:53:52 +00:00
|
|
|
|
|
|
|
|
for i := range 50 {
|
2026-03-30 18:17:07 +00:00
|
|
|
_ = storeInstance.Set("bench", core.Sprintf("key%d", i), core.Sprintf("val%d", i))
|
2026-02-20 04:53:52 +00:00
|
|
|
}
|
|
|
|
|
|
2026-03-30 18:17:07 +00:00
|
|
|
templateSource := `{{ .key0 }} {{ .key25 }} {{ .key49 }}`
|
2026-02-20 04:53:52 +00:00
|
|
|
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
b.ResetTimer()
|
|
|
|
|
|
|
|
|
|
for range b.N {
|
2026-03-30 18:17:07 +00:00
|
|
|
_, _ = storeInstance.Render(templateSource, "bench")
|
2026-02-20 04:53:52 +00:00
|
|
|
}
|
|
|
|
|
}
|