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