VictoriaMetrics/app/vmselect/netstorage/netstorage_timing_test.go

108 lines
2.9 KiB
Go

package netstorage
import (
"fmt"
"testing"
)
func BenchmarkMergeSortBlocks(b *testing.B) {
for _, replicationFactor := range []int{1, 2, 3, 4, 5} {
b.Run(fmt.Sprintf("replicationFactor-%d", replicationFactor), func(b *testing.B) {
const samplesPerBlock = 8192
var blocks []*sortBlock
for j := 0; j < 10; j++ {
timestamps := make([]int64, samplesPerBlock)
values := make([]float64, samplesPerBlock)
for i := range timestamps {
timestamps[i] = int64(j*samplesPerBlock + i)
values[i] = float64(j*samplesPerBlock + i)
}
for i := 0; i < replicationFactor; i++ {
blocks = append(blocks, &sortBlock{
Timestamps: timestamps,
Values: values,
})
}
}
benchmarkMergeSortBlocks(b, blocks)
})
}
b.Run("overlapped-blocks-bestcase", func(b *testing.B) {
const samplesPerBlock = 8192
var blocks []*sortBlock
for j := 0; j < 10; j++ {
timestamps := make([]int64, samplesPerBlock)
values := make([]float64, samplesPerBlock)
for i := range timestamps {
timestamps[i] = int64(j*samplesPerBlock + i)
values[i] = float64(j*samplesPerBlock + i)
}
blocks = append(blocks, &sortBlock{
Timestamps: timestamps,
Values: values,
})
}
for j := 1; j < len(blocks); j++ {
prev := blocks[j-1].Timestamps
curr := blocks[j].Timestamps
for i := 0; i < samplesPerBlock/2; i++ {
prev[i+samplesPerBlock/2], curr[i] = curr[i], prev[i+samplesPerBlock/2]
}
}
benchmarkMergeSortBlocks(b, blocks)
})
b.Run("overlapped-blocks-worstcase", func(b *testing.B) {
const samplesPerBlock = 8192
var blocks []*sortBlock
for j := 0; j < 5; j++ {
timestamps := make([]int64, samplesPerBlock)
values := make([]float64, samplesPerBlock)
for i := range timestamps {
timestamps[i] = int64(2 * (j*samplesPerBlock + i))
values[i] = float64(2 * (j*samplesPerBlock + i))
}
blocks = append(blocks, &sortBlock{
Timestamps: timestamps,
Values: values,
})
timestamps = make([]int64, samplesPerBlock)
values = make([]float64, samplesPerBlock)
for i := range timestamps {
timestamps[i] = int64(2*(j*samplesPerBlock+i) + 1)
values[i] = float64(2*(j*samplesPerBlock+i) + 1)
}
blocks = append(blocks, &sortBlock{
Timestamps: timestamps,
Values: values,
})
}
benchmarkMergeSortBlocks(b, blocks)
})
}
func benchmarkMergeSortBlocks(b *testing.B, blocks []*sortBlock) {
dedupInterval := int64(1)
samples := 0
for _, b := range blocks {
samples += len(b.Timestamps)
}
b.SetBytes(int64(samples))
b.ReportAllocs()
b.RunParallel(func(pb *testing.PB) {
var result Result
sbh := getSortBlocksHeap()
for pb.Next() {
result.reset()
sbs := sbh.sbs[:0]
for _, b := range blocks {
sb := getSortBlock()
sb.Timestamps = b.Timestamps
sb.Values = b.Values
sbs = append(sbs, sb)
}
sbh.sbs = sbs
mergeSortBlocks(&result, sbh, dedupInterval)
}
})
}