Skip to content

Commit 3c8b8b6

Browse files
committed
chore: introduce benchmarks
1 parent 4b37ecc commit 3c8b8b6

File tree

2 files changed

+423
-0
lines changed

2 files changed

+423
-0
lines changed

Diff for: flattener_bench_test.go

+156
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
package quamina
2+
3+
import (
4+
"os"
5+
"strings"
6+
"testing"
7+
)
8+
9+
var (
10+
topMatches []X
11+
topFields []Field
12+
)
13+
14+
type tracker struct {
15+
names map[string]bool
16+
}
17+
18+
func (t tracker) IsNameUsed(label []byte) bool {
19+
_, ok := t.names[string(label)]
20+
return ok
21+
}
22+
23+
const PatternContext = `{ "context": { "user_id": [9034], "friends_count": [158] } }`
24+
const PatternMiddleNestedField = `{ "payload": { "user": { "id_str": ["903487807"] } } }`
25+
const PatternLastField = `{ "payload": { "lang_value": ["ja"] } }`
26+
27+
func Benchmark_JsonFlattener_ContextFields(b *testing.B) {
28+
RunBehcmarkWithJSONFlattener(b, "context", "user_id", "friends_count")
29+
}
30+
31+
func Benchmark_JsonFlattener_MiddleNestedField(b *testing.B) {
32+
RunBehcmarkWithJSONFlattener(b, "payload", "user", "id_str")
33+
}
34+
35+
func Benchmark_JsonFlattener_LastField(b *testing.B) {
36+
RunBehcmarkWithJSONFlattener(b, "payload", "lang_value")
37+
}
38+
39+
func RunBehcmarkWithJSONFlattener(b *testing.B, fields ...string) {
40+
b.Helper()
41+
var localFields []Field
42+
43+
event, err := os.ReadFile("./status.json")
44+
if err != nil {
45+
b.Fatal(err)
46+
}
47+
48+
flattener := newJSONFlattener()
49+
50+
t := tracker{names: make(map[string]bool)}
51+
for _, field := range fields {
52+
t.names[field] = true
53+
}
54+
results, err := flattener.Flatten(event, t)
55+
if err != nil {
56+
b.Fatal(err)
57+
}
58+
PrintFields(b, results)
59+
60+
b.ResetTimer()
61+
b.ReportAllocs()
62+
63+
for i := 0; i < b.N; i++ {
64+
fields, err := flattener.Flatten(event, t)
65+
if err != nil {
66+
b.Fatal(err)
67+
}
68+
69+
localFields = fields
70+
}
71+
72+
topFields = localFields
73+
}
74+
75+
func Benchmark_JsonFlattner_Evaluate_ContextFields(b *testing.B) {
76+
q, err := New()
77+
78+
if err != nil {
79+
b.Fatal(err)
80+
}
81+
82+
RunBenchmarkEvaluate(b, q, PatternContext)
83+
}
84+
85+
func Benchmark_JsonFlattner_Evaluate_MiddleNestedField(b *testing.B) {
86+
q, err := New()
87+
88+
if err != nil {
89+
b.Fatal(err)
90+
}
91+
92+
RunBenchmarkEvaluate(b, q, PatternMiddleNestedField)
93+
}
94+
95+
func Benchmark_JsonFlattner_Evaluate_LastField(b *testing.B) {
96+
q, err := New()
97+
98+
if err != nil {
99+
b.Fatal(err)
100+
}
101+
102+
RunBenchmarkEvaluate(b, q, PatternLastField)
103+
}
104+
105+
func RunBenchmarkEvaluate(b *testing.B, q *Quamina, pattern string) {
106+
b.Helper()
107+
var localMatches []X
108+
109+
err := q.AddPattern(1, pattern)
110+
if err != nil {
111+
b.Fatalf("Failed adding pattern: %+v", err)
112+
}
113+
114+
event, err := os.ReadFile("./status.json")
115+
if err != nil {
116+
b.Fatal(err)
117+
}
118+
119+
matches, err := q.MatchesForEvent(event)
120+
if err != nil {
121+
b.Fatalf("failed matching: %s", err)
122+
}
123+
124+
if len(matches) != 1 {
125+
b.Fatalf("in-correct matching: %+v", matches)
126+
}
127+
128+
b.ReportAllocs()
129+
b.ResetTimer()
130+
131+
for i := 0; i < b.N; i++ {
132+
matches, err := q.MatchesForEvent(event)
133+
if err != nil {
134+
b.Fatalf("failed matching: %s", err)
135+
}
136+
137+
if len(matches) != 1 {
138+
b.Fatalf("in-correct matching: %+v", matches)
139+
}
140+
141+
localMatches = matches
142+
}
143+
144+
topMatches = localMatches
145+
}
146+
147+
func PrintFields(b *testing.B, fields []Field) {
148+
b.Helper()
149+
150+
b.Logf("> Fields\n")
151+
152+
for _, field := range fields {
153+
b.Logf("Path [%s] Val [%s] ArrayTrail [%+v]\n", strings.ReplaceAll(string(field.Path), "\n", "->"), field.Val, field.ArrayTrail)
154+
}
155+
b.Logf("\n")
156+
}

0 commit comments

Comments
 (0)