diff --git a/pkg/cache/internal/cache_reader_test.go b/pkg/cache/internal/cache_reader_test.go new file mode 100644 index 0000000000..02f601499f --- /dev/null +++ b/pkg/cache/internal/cache_reader_test.go @@ -0,0 +1,73 @@ +package internal + +import ( + "fmt" + "strconv" + "strings" + "testing" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/client-go/tools/cache" +) + +func benchmarkByIndexes(sel fields.Selector, b *testing.B) { + indexFunc := func(val string) func(obj interface{}) ([]string, error) { + return func(obj interface{}) ([]string, error) { + pod := obj.(*corev1.Pod) + if strings.Contains(pod.Labels["foo"], val) { + return []string{val}, nil + } + return nil, nil + } + } + + index := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{ + FieldIndexName("idx1"): indexFunc("1"), + FieldIndexName("idx2"): indexFunc("2"), + FieldIndexName("idx3"): indexFunc("3"), + FieldIndexName("idx4"): indexFunc("4"), + FieldIndexName("idx5"): indexFunc("5"), + }) + + for i := 0; i < 10000; i++ { + err := index.Add(&corev1.Pod{ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("test-pod-%d", i), Labels: map[string]string{"foo": strconv.Itoa(i)}}}) + if err != nil { + b.Fatal(err) + } + } + + for i := 0; i < b.N; i++ { + _, err := byIndexes(index, sel.Requirements(), "") + if err != nil { + b.Fatal(err) + } + } +} + +func BenchmarkByIndexes1(b *testing.B) { + sel := fields.ParseSelectorOrDie("idx1=1") + benchmarkByIndexes(sel, b) +} + +func BenchmarkByIndexes2(b *testing.B) { + sel := fields.ParseSelectorOrDie("idx1=1,idx2=2") + benchmarkByIndexes(sel, b) +} + +func BenchmarkByIndexes3(b *testing.B) { + sel := fields.ParseSelectorOrDie("idx1=1,idx2=2,idx3=3") + benchmarkByIndexes(sel, b) +} + +func BenchmarkByIndexes4(b *testing.B) { + sel := fields.ParseSelectorOrDie("idx1=1,idx2=2,idx3=3,idx4=4") + benchmarkByIndexes(sel, b) +} + +func BenchmarkByIndexes5(b *testing.B) { + sel := fields.ParseSelectorOrDie("idx1=1,idx2=2,idx3=3,idx4=4,idx5=5") + benchmarkByIndexes(sel, b) +}