tsdb/index: make BenchmarkIntersect do work on each loop

Previously all the postings constructed were consumed on the first
iteration, so subsequent iterations did no work.

Signed-off-by: Bryan Boreham <bjboreham@gmail.com>
This commit is contained in:
Bryan Boreham 2023-01-03 15:07:22 +00:00
parent e1b7082008
commit 4931983ca9

View file

@ -300,14 +300,13 @@ func BenchmarkIntersect(t *testing.B) {
d = append(d, storage.SeriesRef(i)) d = append(d, storage.SeriesRef(i))
} }
bench.ResetTimer()
bench.ReportAllocs()
for i := 0; i < bench.N; i++ {
i1 := newListPostings(a...) i1 := newListPostings(a...)
i2 := newListPostings(b...) i2 := newListPostings(b...)
i3 := newListPostings(c...) i3 := newListPostings(c...)
i4 := newListPostings(d...) i4 := newListPostings(d...)
bench.ResetTimer()
bench.ReportAllocs()
for i := 0; i < bench.N; i++ {
if _, err := ExpandPostings(Intersect(i1, i2, i3, i4)); err != nil { if _, err := ExpandPostings(Intersect(i1, i2, i3, i4)); err != nil {
bench.Fatal(err) bench.Fatal(err)
} }
@ -330,14 +329,13 @@ func BenchmarkIntersect(t *testing.B) {
d = append(d, storage.SeriesRef(i)) d = append(d, storage.SeriesRef(i))
} }
bench.ResetTimer()
bench.ReportAllocs()
for i := 0; i < bench.N; i++ {
i1 := newListPostings(a...) i1 := newListPostings(a...)
i2 := newListPostings(b...) i2 := newListPostings(b...)
i3 := newListPostings(c...) i3 := newListPostings(c...)
i4 := newListPostings(d...) i4 := newListPostings(d...)
bench.ResetTimer()
bench.ReportAllocs()
for i := 0; i < bench.N; i++ {
if _, err := ExpandPostings(Intersect(i1, i2, i3, i4)); err != nil { if _, err := ExpandPostings(Intersect(i1, i2, i3, i4)); err != nil {
bench.Fatal(err) bench.Fatal(err)
} }
@ -346,20 +344,28 @@ func BenchmarkIntersect(t *testing.B) {
// Many matchers(k >> n). // Many matchers(k >> n).
t.Run("ManyPostings", func(bench *testing.B) { t.Run("ManyPostings", func(bench *testing.B) {
var its []Postings var lps []*ListPostings
var refs [][]storage.SeriesRef
// 100000 matchers(k=100000). // Create 100000 matchers(k=100000), making sure all memory allocation is done before starting the loop.
for i := 0; i < 100000; i++ { for i := 0; i < 100000; i++ {
var temp []storage.SeriesRef var temp []storage.SeriesRef
for j := storage.SeriesRef(1); j < 100; j++ { for j := storage.SeriesRef(1); j < 100; j++ {
temp = append(temp, j) temp = append(temp, j)
} }
its = append(its, newListPostings(temp...)) lps = append(lps, newListPostings(temp...))
refs = append(refs, temp)
} }
its := make([]Postings, len(refs))
bench.ResetTimer() bench.ResetTimer()
bench.ReportAllocs() bench.ReportAllocs()
for i := 0; i < bench.N; i++ { for i := 0; i < bench.N; i++ {
// Reset the ListPostings to their original values each time round the loop.
for j := range refs {
lps[j].list = refs[j]
its[j] = lps[j]
}
if _, err := ExpandPostings(Intersect(its...)); err != nil { if _, err := ExpandPostings(Intersect(its...)); err != nil {
bench.Fatal(err) bench.Fatal(err)
} }