From 08262454a3b6045734b271c2505ad89834a5c40a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Wed, 25 May 2022 15:22:47 +0100 Subject: [PATCH] Preallocate Labels in labels.Builder (#10749) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This tries to avoid re-allocations of labels slice since we know possible max size Signed-off-by: Ɓukasz Mierzwa --- model/labels/labels.go | 4 ++-- promql/engine_test.go | 36 +++++++++++++++++++----------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/model/labels/labels.go b/model/labels/labels.go index 34bb878d1..af321a37c 100644 --- a/model/labels/labels.go +++ b/model/labels/labels.go @@ -349,7 +349,7 @@ func FromStrings(ss ...string) Labels { if len(ss)%2 != 0 { panic("invalid number of strings") } - var res Labels + res := make(Labels, 0, len(ss)/2) for i := 0; i < len(ss); i += 2 { res = append(res, Label{Name: ss[i], Value: ss[i+1]}) } @@ -452,7 +452,7 @@ func (b *Builder) Labels() Labels { // In the general case, labels are removed, modified or moved // rather than added. - res := make(Labels, 0, len(b.base)) + res := make(Labels, 0, len(b.base)+len(b.add)) Outer: for _, l := range b.base { for _, n := range b.del { diff --git a/promql/engine_test.go b/promql/engine_test.go index c34caa4bc..201676b43 100644 --- a/promql/engine_test.go +++ b/promql/engine_test.go @@ -16,6 +16,7 @@ package promql import ( "context" "errors" + "fmt" "os" "sort" "testing" @@ -680,7 +681,6 @@ load 10s Result: Matrix{ Series{ Points: []Point{{V: 1, T: 0}, {V: 1, T: 1000}, {V: 1, T: 2000}}, - Metric: labels.FromStrings(), }, }, Start: time.Unix(0, 0), @@ -717,24 +717,26 @@ load 10s }, } - for _, c := range cases { - var err error - var qry Query - if c.Interval == 0 { - qry, err = test.QueryEngine().NewInstantQuery(test.Queryable(), nil, c.Query, c.Start) - } else { - qry, err = test.QueryEngine().NewRangeQuery(test.Queryable(), nil, c.Query, c.Start, c.End, c.Interval) - } - require.NoError(t, err) + for i, c := range cases { + t.Run(fmt.Sprintf("%d query=%s", i, c.Query), func(t *testing.T) { + var err error + var qry Query + if c.Interval == 0 { + qry, err = test.QueryEngine().NewInstantQuery(test.Queryable(), nil, c.Query, c.Start) + } else { + qry, err = test.QueryEngine().NewRangeQuery(test.Queryable(), nil, c.Query, c.Start, c.End, c.Interval) + } + require.NoError(t, err) - res := qry.Exec(test.Context()) - if c.ShouldError { - require.Error(t, res.Err, "expected error for the query %q", c.Query) - continue - } + res := qry.Exec(test.Context()) + if c.ShouldError { + require.Error(t, res.Err, "expected error for the query %q", c.Query) + return + } - require.NoError(t, res.Err) - require.Equal(t, c.Result, res.Value, "query %q failed", c.Query) + require.NoError(t, res.Err) + require.Equal(t, c.Result, res.Value, "query %q failed", c.Query) + }) } }