Move series fetches out of inner loop of SortedPostings. (#485)
With 1M series: Before: BenchmarkHeadPostingForMatchers-8 1 3501996117 ns/op 61311520 B/op 78 allocs/op After: BenchmarkHeadPostingForMatchers-8 1 1403072952 ns/op 69261568 B/op 72 allocs/op This works out as 3X faster, as the above time includes other things. Signed-off-by: Brian Brazil <brian.brazil@robustperception.io>
This commit is contained in:
parent
48c439d26d
commit
b2d7bbd6b1
27
head.go
27
head.go
|
@ -1096,25 +1096,30 @@ func (h *headIndexReader) Postings(name, value string) (index.Postings, error) {
|
|||
}
|
||||
|
||||
func (h *headIndexReader) SortedPostings(p index.Postings) index.Postings {
|
||||
ep := make([]uint64, 0, 128)
|
||||
series := make([]*memSeries, 0, 128)
|
||||
|
||||
// Fetch all the series only once.
|
||||
for p.Next() {
|
||||
ep = append(ep, p.At())
|
||||
s := h.head.series.getByID(p.At())
|
||||
if s == nil {
|
||||
level.Debug(h.head.logger).Log("msg", "looked up series not found")
|
||||
} else {
|
||||
series = append(series, s)
|
||||
}
|
||||
}
|
||||
if err := p.Err(); err != nil {
|
||||
return index.ErrPostings(errors.Wrap(err, "expand postings"))
|
||||
}
|
||||
|
||||
sort.Slice(ep, func(i, j int) bool {
|
||||
a := h.head.series.getByID(ep[i])
|
||||
b := h.head.series.getByID(ep[j])
|
||||
|
||||
if a == nil || b == nil {
|
||||
level.Debug(h.head.logger).Log("msg", "looked up series not found")
|
||||
return false
|
||||
}
|
||||
return labels.Compare(a.lset, b.lset) < 0
|
||||
sort.Slice(series, func(i, j int) bool {
|
||||
return labels.Compare(series[i].lset, series[j].lset) < 0
|
||||
})
|
||||
|
||||
// Convert back to list.
|
||||
ep := make([]uint64, 0, len(series))
|
||||
for _, p := range series {
|
||||
ep = append(ep, p.ref)
|
||||
}
|
||||
return index.NewListPostings(ep)
|
||||
}
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ func BenchmarkHeadPostingForMatchers(b *testing.B) {
|
|||
defer h.Close()
|
||||
|
||||
// TODO: vary number of series
|
||||
for i := 0; i < 100; i++ {
|
||||
for i := 0; i < 1000000; i++ {
|
||||
h.getOrCreate(uint64(i), labels.FromStrings("a", strconv.Itoa(i)))
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue