Skip to content

Commit 40d2c14

Browse files
committed
add checker benchmarks
1 parent 163df86 commit 40d2c14

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

checker/checker_bench_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package checker_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/expr-lang/expr"
7+
"github.com/expr-lang/expr/checker"
8+
"github.com/expr-lang/expr/conf"
9+
"github.com/expr-lang/expr/parser"
10+
)
11+
12+
func BenchmarkChecker(b *testing.B) {
13+
cases := []struct {
14+
name, input string
15+
}{
16+
{"function calls", `
17+
func(
18+
func(
19+
func(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),
20+
func(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),
21+
func(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),
22+
),
23+
func(
24+
func(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),
25+
func(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),
26+
func(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),
27+
),
28+
func(
29+
func(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),
30+
func(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),
31+
func(func(a, 'a', 1, nil), func(a, 'a', 1, nil), func(a, 'a', 1, nil)),
32+
)
33+
)
34+
`},
35+
{"unary and binary operations", `
36+
!b && !b || !b == !b && !b != !b || 1 < 1.0 && 0.1 > 1 || 0 <= 1.0 && 0.1 >= 1 &&
37+
!b && !b || !b == !b && !b != !b || 1 < 1.0 && 0.1 > 1 || 0 <= 1.0 && 0.1 >= 1 &&
38+
!b && !b || !b == !b && !b != !b || 1 < 1.0 && 0.1 > 1 || 0 <= 1.0 && 0.1 >= 1 &&
39+
!b && !b || !b == !b && !b != !b || 1 < 1.0 && 0.1 > 1 || 0 <= 1.0 && 0.1 >= 1 &&
40+
!b && !b || !b == !b && !b != !b || 1 < 1.0 && 0.1 > 1 || 0 <= 1.0 && 0.1 >= 1 &&
41+
!b && !b || !b == !b && !b != !b || 1 < 1.0 && 0.1 > 1 || 0 <= 1.0 && 0.1 >= 1
42+
`},
43+
{"deep struct access", `
44+
a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.
45+
a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.
46+
a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.
47+
a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a
48+
`},
49+
}
50+
51+
f := func(params ...any) (any, error) { return nil, nil }
52+
env := map[string]any{
53+
"a": new(recursive),
54+
"b": true,
55+
"func": f,
56+
}
57+
config := conf.New(env)
58+
expr.Function("func", f, f)
59+
expr.ConstExpr("func")
60+
61+
for _, c := range cases {
62+
b.Run("name="+c.name, func(b *testing.B) {
63+
tree, err := parser.ParseWithConfig(c.input, config)
64+
if err != nil {
65+
b.Fatal(err)
66+
}
67+
b.ReportAllocs()
68+
b.ResetTimer()
69+
for i := 0; i < b.N; i++ {
70+
_, err = checker.Check(tree, config)
71+
if err != nil {
72+
b.Fatal(err)
73+
}
74+
}
75+
})
76+
}
77+
78+
}
79+
80+
type recursive struct {
81+
Inner *recursive `expr:"a"`
82+
}

0 commit comments

Comments
 (0)