forked from expr-lang/expr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
bench_test.go
97 lines (85 loc) · 1.59 KB
/
bench_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package expr_test
import (
"testing"
"github.com/antonmedv/expr"
)
type Segment struct {
Origin string
}
type Passengers struct {
Adults int
}
type Env struct {
Segments []Segment
Passengers Passengers
Marker string
}
func (e *Env) First(s []Segment) string {
return s[0].Origin
}
var env = Env{
Segments: []Segment{
{Origin: "LED"},
{Origin: "HKT"},
},
Passengers: Passengers{
Adults: 2,
},
Marker: "test",
}
func Benchmark_struct(b *testing.B) {
program, err := expr.Parse(
`Segments[0].Origin == "LED" && Passengers.Adults == 2 && Marker == "test"`,
expr.Env(Env{}),
)
if err != nil {
b.Fatal(err)
}
out, err := expr.Run(program, env)
if err != nil {
panic(err)
}
if !out.(bool) {
panic("unexpected result")
}
for n := 0; n < b.N; n++ {
expr.Run(program, env)
}
}
func Benchmark_map(b *testing.B) {
env := map[string]interface{}{
"segments": env.Segments,
"passengers": env.Passengers,
"marker": env.Marker,
}
program, err := expr.Parse(`segments[0].Origin == "LED" && passengers.Adults == 2 && marker == "test"`)
if err != nil {
b.Fatal(err)
}
out, err := expr.Run(program, env)
if err != nil {
panic(err)
}
if !out.(bool) {
panic("unexpected result")
}
for n := 0; n < b.N; n++ {
expr.Run(program, env)
}
}
func Benchmark_func(b *testing.B) {
program, err := expr.Parse(`First(Segments)`, expr.Env(&Env{}))
if err != nil {
b.Fatal(err)
}
out, err := expr.Run(program, &env)
if err != nil {
panic(err)
}
if out.(string) != "LED" {
panic("unexpected result")
}
for n := 0; n < b.N; n++ {
expr.Run(program, &env)
}
}