Merge pull request #73529 from wojtek-t/optimize_index

Optimize Index() method to avoid unnecessary copies
This commit is contained in:
Kubernetes Prow Robot 2019-01-31 00:20:19 -08:00 committed by GitHub
commit 94b5aeba9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -148,14 +148,21 @@ func (c *threadSafeMap) Index(indexName string, obj interface{}) ([]interface{},
} }
index := c.indices[indexName] index := c.indices[indexName]
// need to de-dupe the return list. Since multiple keys are allowed, this can happen. var returnKeySet sets.String
returnKeySet := sets.String{} if len(indexKeys) == 1 {
// In majority of cases, there is exactly one value matching.
// Optimize the most common path - deduping is not needed here.
returnKeySet = index[indexKeys[0]]
} else {
// Need to de-dupe the return list.
// Since multiple keys are allowed, this can happen.
returnKeySet = sets.String{}
for _, indexKey := range indexKeys { for _, indexKey := range indexKeys {
set := index[indexKey] for key := range index[indexKey] {
for _, key := range set.UnsortedList() {
returnKeySet.Insert(key) returnKeySet.Insert(key)
} }
} }
}
list := make([]interface{}, 0, returnKeySet.Len()) list := make([]interface{}, 0, returnKeySet.Len())
for absoluteKey := range returnKeySet { for absoluteKey := range returnKeySet {