Skip to content

Commit 0dafcb4

Browse files
Merge pull request #102188 from alculquicondor/fasterselector
Improve slice allocation in LabelSelectorAsSelector Kubernetes-commit: 785d9f028a9514034e705216e06262f30a449f6b
2 parents 8303750 + 51eb781 commit 0dafcb4

3 files changed

Lines changed: 29 additions & 11 deletions

File tree

pkg/apis/meta/v1/helpers.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ func LabelSelectorAsSelector(ps *LabelSelector) (labels.Selector, error) {
3838
if len(ps.MatchLabels)+len(ps.MatchExpressions) == 0 {
3939
return labels.Everything(), nil
4040
}
41-
selector := labels.NewSelector()
41+
requirements := make([]labels.Requirement, 0, len(ps.MatchLabels)+len(ps.MatchExpressions))
4242
for k, v := range ps.MatchLabels {
4343
r, err := labels.NewRequirement(k, selection.Equals, []string{v})
4444
if err != nil {
4545
return nil, err
4646
}
47-
selector = selector.Add(*r)
47+
requirements = append(requirements, *r)
4848
}
4949
for _, expr := range ps.MatchExpressions {
5050
var op selection.Operator
@@ -64,8 +64,10 @@ func LabelSelectorAsSelector(ps *LabelSelector) (labels.Selector, error) {
6464
if err != nil {
6565
return nil, err
6666
}
67-
selector = selector.Add(*r)
67+
requirements = append(requirements, *r)
6868
}
69+
selector := labels.NewSelector()
70+
selector = selector.Add(requirements...)
6971
return selector, nil
7072
}
7173

@@ -154,7 +156,7 @@ func SetAsLabelSelector(ls labels.Set) *LabelSelector {
154156
}
155157

156158
selector := &LabelSelector{
157-
MatchLabels: make(map[string]string),
159+
MatchLabels: make(map[string]string, len(ls)),
158160
}
159161
for label, value := range ls {
160162
selector.MatchLabels[label] = value

pkg/apis/meta/v1/helpers_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,26 @@ func TestLabelSelectorAsSelector(t *testing.T) {
9393
}
9494
}
9595

96+
func BenchmarkLabelSelectorAsSelector(b *testing.B) {
97+
selector := &LabelSelector{
98+
MatchLabels: map[string]string{
99+
"foo": "foo",
100+
"bar": "bar",
101+
},
102+
MatchExpressions: []LabelSelectorRequirement{{
103+
Key: "baz",
104+
Operator: LabelSelectorOpExists,
105+
}},
106+
}
107+
b.StartTimer()
108+
for i := 0; i < b.N; i++ {
109+
_, err := LabelSelectorAsSelector(selector)
110+
if err != nil {
111+
b.Fatal(err)
112+
}
113+
}
114+
}
115+
96116
func TestLabelSelectorAsMap(t *testing.T) {
97117
matchLabels := map[string]string{"foo": "bar"}
98118
matchExpressions := func(operator LabelSelectorOperator, values []string) []LabelSelectorRequirement {

pkg/labels/selector.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -367,13 +367,9 @@ func safeSort(in []string) []string {
367367

368368
// Add adds requirements to the selector. It copies the current selector returning a new one
369369
func (s internalSelector) Add(reqs ...Requirement) Selector {
370-
var ret internalSelector
371-
for ix := range s {
372-
ret = append(ret, s[ix])
373-
}
374-
for _, r := range reqs {
375-
ret = append(ret, r)
376-
}
370+
ret := make(internalSelector, 0, len(s)+len(reqs))
371+
ret = append(ret, s...)
372+
ret = append(ret, reqs...)
377373
sort.Sort(ByKey(ret))
378374
return ret
379375
}

0 commit comments

Comments
 (0)