Merge pull request #102188 from alculquicondor/fasterselector

Improve slice allocation in LabelSelectorAsSelector
This commit is contained in:
Kubernetes Prow Robot 2021-07-07 17:05:06 -07:00 committed by GitHub
commit 785d9f028a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 11 deletions

View File

@ -38,13 +38,13 @@ func LabelSelectorAsSelector(ps *LabelSelector) (labels.Selector, error) {
if len(ps.MatchLabels)+len(ps.MatchExpressions) == 0 { if len(ps.MatchLabels)+len(ps.MatchExpressions) == 0 {
return labels.Everything(), nil return labels.Everything(), nil
} }
selector := labels.NewSelector() requirements := make([]labels.Requirement, 0, len(ps.MatchLabels)+len(ps.MatchExpressions))
for k, v := range ps.MatchLabels { for k, v := range ps.MatchLabels {
r, err := labels.NewRequirement(k, selection.Equals, []string{v}) r, err := labels.NewRequirement(k, selection.Equals, []string{v})
if err != nil { if err != nil {
return nil, err return nil, err
} }
selector = selector.Add(*r) requirements = append(requirements, *r)
} }
for _, expr := range ps.MatchExpressions { for _, expr := range ps.MatchExpressions {
var op selection.Operator var op selection.Operator
@ -64,8 +64,10 @@ func LabelSelectorAsSelector(ps *LabelSelector) (labels.Selector, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
selector = selector.Add(*r) requirements = append(requirements, *r)
} }
selector := labels.NewSelector()
selector = selector.Add(requirements...)
return selector, nil return selector, nil
} }
@ -154,7 +156,7 @@ func SetAsLabelSelector(ls labels.Set) *LabelSelector {
} }
selector := &LabelSelector{ selector := &LabelSelector{
MatchLabels: make(map[string]string), MatchLabels: make(map[string]string, len(ls)),
} }
for label, value := range ls { for label, value := range ls {
selector.MatchLabels[label] = value selector.MatchLabels[label] = value

View File

@ -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) { func TestLabelSelectorAsMap(t *testing.T) {
matchLabels := map[string]string{"foo": "bar"} matchLabels := map[string]string{"foo": "bar"}
matchExpressions := func(operator LabelSelectorOperator, values []string) []LabelSelectorRequirement { matchExpressions := func(operator LabelSelectorOperator, values []string) []LabelSelectorRequirement {

View File

@ -367,13 +367,9 @@ func safeSort(in []string) []string {
// Add adds requirements to the selector. It copies the current selector returning a new one // Add adds requirements to the selector. It copies the current selector returning a new one
func (s internalSelector) Add(reqs ...Requirement) Selector { func (s internalSelector) Add(reqs ...Requirement) Selector {
var ret internalSelector ret := make(internalSelector, 0, len(s)+len(reqs))
for ix := range s { ret = append(ret, s...)
ret = append(ret, s[ix]) ret = append(ret, reqs...)
}
for _, r := range reqs {
ret = append(ret, r)
}
sort.Sort(ByKey(ret)) sort.Sort(ByKey(ret))
return ret return ret
} }