From 8622a7e6f5a81c782bd641c33b17c6770aaff341 Mon Sep 17 00:00:00 2001 From: Yan Zhu Date: Mon, 9 Oct 2023 18:09:05 +0800 Subject: [PATCH] add bench test for byIndexes $ go test -run=XXX -count=5 -bench=. sigs.k8s.io/controller-runtime/pkg/cache/internal goos: linux goarch: amd64 pkg: sigs.k8s.io/controller-runtime/pkg/cache/internal cpu: Intel(R) Core(TM) i5-9600K CPU @ 3.70GHz BenchmarkByIndexes1-4 4208028 292.4 ns/op BenchmarkByIndexes1-4 4045444 286.0 ns/op BenchmarkByIndexes1-4 4226229 280.1 ns/op BenchmarkByIndexes1-4 4239436 280.1 ns/op BenchmarkByIndexes1-4 4179435 293.4 ns/op BenchmarkByIndexes2-4 2602788 486.0 ns/op BenchmarkByIndexes2-4 2169660 474.7 ns/op BenchmarkByIndexes2-4 2575916 478.9 ns/op BenchmarkByIndexes2-4 2544490 463.5 ns/op BenchmarkByIndexes2-4 2524232 484.2 ns/op BenchmarkByIndexes3-4 2030055 561.2 ns/op BenchmarkByIndexes3-4 2113954 580.8 ns/op BenchmarkByIndexes3-4 1839356 589.2 ns/op BenchmarkByIndexes3-4 1685526 610.7 ns/op BenchmarkByIndexes3-4 1933444 600.2 ns/op BenchmarkByIndexes4-4 1813144 681.9 ns/op BenchmarkByIndexes4-4 1566775 667.5 ns/op BenchmarkByIndexes4-4 1807480 658.5 ns/op BenchmarkByIndexes4-4 1806310 656.9 ns/op BenchmarkByIndexes4-4 1539990 673.1 ns/op BenchmarkByIndexes5-4 1610383 751.0 ns/op BenchmarkByIndexes5-4 1344288 774.8 ns/op BenchmarkByIndexes5-4 1586659 785.9 ns/op BenchmarkByIndexes5-4 1574892 770.8 ns/op BenchmarkByIndexes5-4 1382383 787.7 ns/op PASS ok sigs.k8s.io/controller-runtime/pkg/cache/internal 50.485s --- pkg/cache/internal/cache_reader_test.go | 73 +++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 pkg/cache/internal/cache_reader_test.go 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) +}