VictoriaMetrics/lib/mergeset/encoding_timing_test.go
Aliaksandr Valialkin af5bdb9254
lib/mergeset: remove superflouos sorting of inmemoryBlock.data at inmemoryBlock.sort()
There is no need to sort the underlying data according to sorted items there.
This should reduce cpu usage when registering new time series in `indexdb`.

Thanks to @ahfuzhang for the suggestion at https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2245
2022-02-24 11:20:32 +02:00

60 lines
1.4 KiB
Go

package mergeset
import (
"fmt"
"sort"
"testing"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
)
func BenchmarkInmemoryBlockMarshal(b *testing.B) {
const itemsCount = 1000
var ibSrc inmemoryBlock
for i := 0; i < itemsCount; i++ {
item := []byte(fmt.Sprintf("key %d", i))
if !ibSrc.Add(item) {
b.Fatalf("cannot add more than %d items", i)
}
}
sort.Sort(&ibSrc)
b.ResetTimer()
b.SetBytes(itemsCount)
b.ReportAllocs()
b.RunParallel(func(pb *testing.PB) {
var sb storageBlock
var firstItem, commonPrefix []byte
var n uint32
for pb.Next() {
firstItem, commonPrefix, n, _ = ibSrc.MarshalUnsortedData(&sb, firstItem[:0], commonPrefix[:0], 0)
if int(n) != itemsCount {
logger.Panicf("invalid number of items marshaled; got %d; want %d", n, itemsCount)
}
}
})
}
func BenchmarkInmemoryBlockUnmarshal(b *testing.B) {
var ibSrc inmemoryBlock
for i := 0; i < 1000; i++ {
item := []byte(fmt.Sprintf("key %d", i))
if !ibSrc.Add(item) {
b.Fatalf("cannot add more than %d items", i)
}
}
var sbSrc storageBlock
firstItem, commonPrefix, itemsCount, mt := ibSrc.MarshalUnsortedData(&sbSrc, nil, nil, 0)
b.ResetTimer()
b.SetBytes(int64(itemsCount))
b.ReportAllocs()
b.RunParallel(func(pb *testing.PB) {
var ib inmemoryBlock
for pb.Next() {
if err := ib.UnmarshalData(&sbSrc, firstItem, commonPrefix, itemsCount, mt); err != nil {
logger.Panicf("cannot unmarshal inmemoryBlock: %s", err)
}
}
})
}