Skip to content

Commit c1d0812

Browse files
committed
test: add benchmark test
Signed-off-by: Dwi Siswanto <[email protected]>
1 parent 95e49c9 commit c1d0812

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

dsl_benchmark_test.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package dsl
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
"github.com/Knetic/govaluate"
8+
)
9+
10+
func BenchmarkDSLCaching(b *testing.B) {
11+
// simple function that has some computational cost
12+
computeFunc := func(args ...interface{}) (interface{}, error) {
13+
time.Sleep(time.Microsecond)
14+
return "computed value", nil
15+
}
16+
17+
funcs := make(map[string]dslFunction)
18+
funcs["cached_func"] = dslFunction{
19+
IsCacheable: true,
20+
Name: "cached_func",
21+
NumberOfArgs: 1,
22+
Signatures: nil,
23+
ExpressionFunction: computeFunc,
24+
}
25+
funcs["uncached_func"] = dslFunction{
26+
IsCacheable: false,
27+
Name: "uncached_func",
28+
NumberOfArgs: 1,
29+
Signatures: nil,
30+
ExpressionFunction: computeFunc,
31+
}
32+
33+
exprs := make(map[string]govaluate.ExpressionFunction)
34+
for name, fn := range funcs {
35+
exprs[name] = fn.Exec
36+
}
37+
38+
resultCache.Purge()
39+
40+
evaluateForBenchmark := func(b *testing.B, fn string, args ...any) any {
41+
res, err := exprs[fn](args...)
42+
if err != nil {
43+
b.Fatalf("Error evaluating expression: %v", err)
44+
}
45+
return res
46+
}
47+
48+
b.Run("Cached-single", func(b *testing.B) {
49+
b.ResetTimer()
50+
for i := 0; i < b.N; i++ {
51+
evaluateForBenchmark(b, "cached_func", 1)
52+
}
53+
})
54+
55+
b.Run("Uncached-single", func(b *testing.B) {
56+
b.ResetTimer()
57+
for i := 0; i < b.N; i++ {
58+
evaluateForBenchmark(b, "uncached_func", 1)
59+
}
60+
})
61+
62+
// test cache key generation
63+
64+
b.Run("Cached-diff", func(b *testing.B) {
65+
b.ResetTimer()
66+
for i := 0; i < b.N; i++ {
67+
evaluateForBenchmark(b, "cached_func", i%100)
68+
}
69+
})
70+
71+
b.Run("Uncached-diff", func(b *testing.B) {
72+
b.ResetTimer()
73+
for i := 0; i < b.N; i++ {
74+
evaluateForBenchmark(b, "uncached_func", i%100)
75+
}
76+
})
77+
78+
// test cache hit
79+
80+
b.Run("Cached-repeat", func(b *testing.B) {
81+
// Pre-warm
82+
for i := 0; i < 10; i++ {
83+
evaluateForBenchmark(b, "cached_func", i)
84+
}
85+
86+
b.ResetTimer()
87+
for i := 0; i < b.N; i++ {
88+
evaluateForBenchmark(b, "cached_func", i%10)
89+
}
90+
})
91+
92+
b.Run("Uncached-repeat", func(b *testing.B) {
93+
// Pre-warm
94+
for i := 0; i < 10; i++ {
95+
evaluateForBenchmark(b, "uncached_func", i)
96+
}
97+
98+
b.ResetTimer()
99+
for i := 0; i < b.N; i++ {
100+
evaluateForBenchmark(b, "uncached_func", i%10)
101+
}
102+
})
103+
}

0 commit comments

Comments
 (0)