mirror of
https://github.com/prometheus/prometheus.git
synced 2025-03-05 20:59:13 -08:00
Optimization on mergedStringIter
(#12132)
Optimization on NewMergedStringIter Signed-off-by: Alan Protasio <alanprot@gmail.com>
This commit is contained in:
parent
3ac49d4ae2
commit
6ddadd98b4
|
@ -958,6 +958,7 @@ type mergedStringIter struct {
|
||||||
b index.StringIter
|
b index.StringIter
|
||||||
aok, bok bool
|
aok, bok bool
|
||||||
cur string
|
cur string
|
||||||
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *mergedStringIter) Next() bool {
|
func (m *mergedStringIter) Next() bool {
|
||||||
|
@ -968,29 +969,34 @@ func (m *mergedStringIter) Next() bool {
|
||||||
if !m.aok {
|
if !m.aok {
|
||||||
m.cur = m.b.At()
|
m.cur = m.b.At()
|
||||||
m.bok = m.b.Next()
|
m.bok = m.b.Next()
|
||||||
|
m.err = m.b.Err()
|
||||||
} else if !m.bok {
|
} else if !m.bok {
|
||||||
m.cur = m.a.At()
|
m.cur = m.a.At()
|
||||||
m.aok = m.a.Next()
|
m.aok = m.a.Next()
|
||||||
|
m.err = m.a.Err()
|
||||||
} else if m.b.At() > m.a.At() {
|
} else if m.b.At() > m.a.At() {
|
||||||
m.cur = m.a.At()
|
m.cur = m.a.At()
|
||||||
m.aok = m.a.Next()
|
m.aok = m.a.Next()
|
||||||
|
m.err = m.a.Err()
|
||||||
} else if m.a.At() > m.b.At() {
|
} else if m.a.At() > m.b.At() {
|
||||||
m.cur = m.b.At()
|
m.cur = m.b.At()
|
||||||
m.bok = m.b.Next()
|
m.bok = m.b.Next()
|
||||||
|
m.err = m.b.Err()
|
||||||
} else { // Equal.
|
} else { // Equal.
|
||||||
m.cur = m.b.At()
|
m.cur = m.b.At()
|
||||||
m.aok = m.a.Next()
|
m.aok = m.a.Next()
|
||||||
|
m.err = m.a.Err()
|
||||||
m.bok = m.b.Next()
|
m.bok = m.b.Next()
|
||||||
|
if m.err == nil {
|
||||||
|
m.err = m.b.Err()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
func (m mergedStringIter) At() string { return m.cur }
|
func (m mergedStringIter) At() string { return m.cur }
|
||||||
func (m mergedStringIter) Err() error {
|
func (m mergedStringIter) Err() error {
|
||||||
if m.a.Err() != nil {
|
return m.err
|
||||||
return m.a.Err()
|
|
||||||
}
|
|
||||||
return m.b.Err()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeletedIterator wraps chunk Iterator and makes sure any deleted metrics are not returned.
|
// DeletedIterator wraps chunk Iterator and makes sure any deleted metrics are not returned.
|
||||||
|
|
|
@ -19,9 +19,10 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
|
|
||||||
"github.com/prometheus/prometheus/model/labels"
|
"github.com/prometheus/prometheus/model/labels"
|
||||||
|
"github.com/prometheus/prometheus/tsdb/index"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Make entries ~50B in size, to emulate real-world high cardinality.
|
// Make entries ~50B in size, to emulate real-world high cardinality.
|
||||||
|
@ -202,6 +203,28 @@ func benchmarkLabelValuesWithMatchers(b *testing.B, ir IndexReader) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkMergedStringIter(b *testing.B) {
|
||||||
|
numSymbols := 100000
|
||||||
|
s := make([]string, numSymbols)
|
||||||
|
for i := 0; i < numSymbols; i++ {
|
||||||
|
s[i] = fmt.Sprintf("symbol%v", i)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
it := NewMergedStringIter(index.NewStringListIter(s), index.NewStringListIter(s))
|
||||||
|
for j := 0; j < 100; j++ {
|
||||||
|
it = NewMergedStringIter(it, index.NewStringListIter(s))
|
||||||
|
}
|
||||||
|
|
||||||
|
for it.Next() {
|
||||||
|
require.NotNil(b, it.At())
|
||||||
|
require.NoError(b, it.Err())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkQuerierSelect(b *testing.B) {
|
func BenchmarkQuerierSelect(b *testing.B) {
|
||||||
chunkDir := b.TempDir()
|
chunkDir := b.TempDir()
|
||||||
opts := DefaultHeadOptions()
|
opts := DefaultHeadOptions()
|
||||||
|
|
Loading…
Reference in a new issue