diff --git a/pkg/eventfilter/benchmarks/attributes_benchmark_test.go b/pkg/eventfilter/benchmarks/attributes_benchmark_test.go new file mode 100644 index 00000000000..7aface791ee --- /dev/null +++ b/pkg/eventfilter/benchmarks/attributes_benchmark_test.go @@ -0,0 +1,63 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package benchmarks + +import ( + "testing" + + cetest "github.com/cloudevents/sdk-go/v2/test" + + "knative.dev/eventing/pkg/eventfilter" + "knative.dev/eventing/pkg/eventfilter/attributes" +) + +func BenchmarkAttributesFilter(b *testing.B) { + event := cetest.FullEvent() + + RunFilterBenchmarks(b, + func(i interface{}) eventfilter.Filter { + return attributes.NewAttributesFilter(i.(map[string]string)) + }, + FilterBenchmark{ + name: "Pass with exact match of id", + arg: map[string]string{"id": event.ID()}, + event: event, + }, + FilterBenchmark{ + // We don't test time because the exact match on the string apparently doesn't work well, + // which might cause the filter to fail. + name: "Pass with exact match of all context attributes (except time)", + arg: map[string]string{ + "id": event.ID(), + "source": event.Source(), + "type": event.Type(), + "dataschema": event.DataSchema(), + "datacontenttype": event.DataContentType(), + "subject": event.Subject(), + }, + event: event, + }, + FilterBenchmark{ + name: "No pass with exact match of id and source", + arg: map[string]string{ + "id": "qwertyuiopasdfghjklzxcvbnm", + "source": "qwertyuiopasdfghjklzxcvbnm", + }, + event: event, + }, + ) +} diff --git a/pkg/eventfilter/benchmarks/common_benchmark_test.go b/pkg/eventfilter/benchmarks/common_benchmark_test.go new file mode 100644 index 00000000000..793dc2103b0 --- /dev/null +++ b/pkg/eventfilter/benchmarks/common_benchmark_test.go @@ -0,0 +1,56 @@ +/* +Copyright 2020 The Knative Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package benchmarks + +import ( + "context" + "testing" + + cloudevents "github.com/cloudevents/sdk-go/v2" + + "knative.dev/eventing/pkg/eventfilter" +) + +type FilterBenchmark struct { + name string + arg interface{} + event cloudevents.Event +} + +// Avoid DCE +var Filter eventfilter.Filter +var Result eventfilter.FilterResult + +// RunFilterBenchmarks executes 2 benchmark runs for each of the provided bench cases: +// 1. "Creation: ..." benchmark measures the time/mem to create the filter, given the filter constructor and the argument +// 2. "Run: ..." benchmark measures the time/mem to execute the filter, given a pre-built filter instance and the provided event +func RunFilterBenchmarks(b *testing.B, filterCtor func(interface{}) eventfilter.Filter, filterBenchmarks ...FilterBenchmark) { + for _, fb := range filterBenchmarks { + b.Run("Creation: "+fb.name, func(b *testing.B) { + for i := 0; i < b.N; i++ { + Filter = filterCtor(fb.arg) + } + }) + // Filter to use for the run + f := filterCtor(fb.arg) + b.Run("Run: "+fb.name, func(b *testing.B) { + for i := 0; i < b.N; i++ { + Result = f.Filter(context.TODO(), fb.event) + } + }) + } +}