|
1 | 1 | package checker_test
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "runtime" |
4 | 5 | "testing"
|
5 | 6 |
|
6 | 7 | "github.com/expr-lang/expr"
|
| 8 | + "github.com/expr-lang/expr/ast" |
7 | 9 | "github.com/expr-lang/expr/checker"
|
| 10 | + "github.com/expr-lang/expr/checker/nature" |
8 | 11 | "github.com/expr-lang/expr/conf"
|
9 | 12 | "github.com/expr-lang/expr/parser"
|
10 | 13 | )
|
@@ -59,22 +62,51 @@ 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
|
59 | 62 | expr.ConstExpr("func")
|
60 | 63 |
|
61 | 64 | for _, c := range cases {
|
62 |
| - b.Run("name="+c.name, func(b *testing.B) { |
| 65 | + batchSize := 100_000 |
| 66 | + if batchSize > b.N { |
| 67 | + batchSize = b.N |
| 68 | + } |
| 69 | + trees := make([]*parser.Tree, 0, batchSize) |
| 70 | + for i := 0; i < batchSize; i++ { |
63 | 71 | tree, err := parser.ParseWithConfig(c.input, config)
|
64 | 72 | if err != nil {
|
65 | 73 | b.Fatal(err)
|
66 | 74 | }
|
67 |
| - b.ReportAllocs() |
68 |
| - b.ResetTimer() |
| 75 | + trees = append(trees, tree) |
| 76 | + } |
| 77 | + runtime.GC() // try to cleanup the mess from the initialization |
| 78 | + |
| 79 | + b.Run("name="+c.name, func(b *testing.B) { |
| 80 | + var err error |
69 | 81 | for i := 0; i < b.N; i++ {
|
70 |
| - _, err = checker.Check(tree, config) |
71 |
| - if err != nil { |
72 |
| - b.Fatal(err) |
| 82 | + j := i |
| 83 | + if j < 0 || j >= len(trees) { |
| 84 | + b.StopTimer() |
| 85 | + invalidateTrees(trees...) |
| 86 | + j = 0 |
| 87 | + b.StartTimer() |
73 | 88 | }
|
| 89 | + |
| 90 | + _, err = checker.Check(trees[j], config) |
| 91 | + } |
| 92 | + b.StopTimer() |
| 93 | + if err != nil { |
| 94 | + b.Fatal(err) |
74 | 95 | }
|
75 | 96 | })
|
76 | 97 | }
|
| 98 | +} |
| 99 | + |
| 100 | +type visitorFunc func(*ast.Node) |
77 | 101 |
|
| 102 | +func (f visitorFunc) Visit(node *ast.Node) { f(node) } |
| 103 | + |
| 104 | +func invalidateTrees(trees ...*parser.Tree) { |
| 105 | + for _, tree := range trees { |
| 106 | + ast.Walk(&tree.Node, visitorFunc(func(node *ast.Node) { |
| 107 | + (*node).SetNature(nature.Nature{}) |
| 108 | + })) |
| 109 | + } |
78 | 110 | }
|
79 | 111 |
|
80 | 112 | type recursive struct {
|
|
0 commit comments