From 19c23949154b11c67f8ae9fc6f9863b2a8dbba46 Mon Sep 17 00:00:00 2001 From: Aldo Culquicondor Date: Thu, 20 May 2021 17:00:07 +0000 Subject: [PATCH 1/2] Add benchmark for LabelSelectorAsSelector --- .../pkg/apis/meta/v1/helpers_test.go | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/helpers_test.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/helpers_test.go index 85bb868a85b4..ff22f6babcf1 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/helpers_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/helpers_test.go @@ -93,6 +93,26 @@ func TestLabelSelectorAsSelector(t *testing.T) { } } +func BenchmarkLabelSelectorAsSelector(b *testing.B) { + selector := &LabelSelector{ + MatchLabels: map[string]string{ + "foo": "foo", + "bar": "bar", + }, + MatchExpressions: []LabelSelectorRequirement{{ + Key: "baz", + Operator: LabelSelectorOpExists, + }}, + } + b.StartTimer() + for i := 0; i < b.N; i++ { + _, err := LabelSelectorAsSelector(selector) + if err != nil { + b.Fatal(err) + } + } +} + func TestLabelSelectorAsMap(t *testing.T) { matchLabels := map[string]string{"foo": "bar"} matchExpressions := func(operator LabelSelectorOperator, values []string) []LabelSelectorRequirement { From 82e4ab5ec629bbae431b36f794b90222f9cb00a8 Mon Sep 17 00:00:00 2001 From: Aldo Culquicondor Date: Thu, 20 May 2021 19:52:22 +0000 Subject: [PATCH 2/2] Improve slice allocation in LabelSelectorAsSelector --- .../k8s.io/apimachinery/pkg/apis/meta/v1/helpers.go | 10 ++++++---- staging/src/k8s.io/apimachinery/pkg/labels/selector.go | 10 +++------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/helpers.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/helpers.go index 3c5a1518c8ed..2b6a30b655a6 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/helpers.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/helpers.go @@ -38,13 +38,13 @@ func LabelSelectorAsSelector(ps *LabelSelector) (labels.Selector, error) { if len(ps.MatchLabels)+len(ps.MatchExpressions) == 0 { return labels.Everything(), nil } - selector := labels.NewSelector() + requirements := make([]labels.Requirement, 0, len(ps.MatchLabels)+len(ps.MatchExpressions)) for k, v := range ps.MatchLabels { r, err := labels.NewRequirement(k, selection.Equals, []string{v}) if err != nil { return nil, err } - selector = selector.Add(*r) + requirements = append(requirements, *r) } for _, expr := range ps.MatchExpressions { var op selection.Operator @@ -64,8 +64,10 @@ func LabelSelectorAsSelector(ps *LabelSelector) (labels.Selector, error) { if err != nil { return nil, err } - selector = selector.Add(*r) + requirements = append(requirements, *r) } + selector := labels.NewSelector() + selector = selector.Add(requirements...) return selector, nil } @@ -154,7 +156,7 @@ func SetAsLabelSelector(ls labels.Set) *LabelSelector { } selector := &LabelSelector{ - MatchLabels: make(map[string]string), + MatchLabels: make(map[string]string, len(ls)), } for label, value := range ls { selector.MatchLabels[label] = value diff --git a/staging/src/k8s.io/apimachinery/pkg/labels/selector.go b/staging/src/k8s.io/apimachinery/pkg/labels/selector.go index 4b8ca3ec2f67..9eea34579b80 100644 --- a/staging/src/k8s.io/apimachinery/pkg/labels/selector.go +++ b/staging/src/k8s.io/apimachinery/pkg/labels/selector.go @@ -367,13 +367,9 @@ func safeSort(in []string) []string { // Add adds requirements to the selector. It copies the current selector returning a new one func (s internalSelector) Add(reqs ...Requirement) Selector { - var ret internalSelector - for ix := range s { - ret = append(ret, s[ix]) - } - for _, r := range reqs { - ret = append(ret, r) - } + ret := make(internalSelector, 0, len(s)+len(reqs)) + ret = append(ret, s...) + ret = append(ret, reqs...) sort.Sort(ByKey(ret)) return ret }