Skip to content

Commit 4abcce4

Browse files
committed
add benchmark
1 parent 91c71a2 commit 4abcce4

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed

resp/xrange_bench_test.go

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
package resp
2+
3+
import (
4+
"bufio"
5+
"context"
6+
"strconv"
7+
"testing"
8+
9+
"github.com/redis/rueidis"
10+
)
11+
12+
func BenchmarkXRange1000Entries(b *testing.B) {
13+
ctx := context.Background()
14+
client, err := rueidis.NewClient(rueidis.ClientOption{InitAddress: []string{"127.0.0.1:6379"}})
15+
if err != nil {
16+
b.Fatal(err)
17+
}
18+
defer client.Close()
19+
20+
// Setup: Create a stream with 1000 entries
21+
streamKey := "benchmark:xrange:stream"
22+
23+
// Clean up any existing stream
24+
client.Do(ctx, client.B().Del().Key(streamKey).Build())
25+
26+
// Add 1000 entries to the stream
27+
for i := 0; i < 1000; i++ {
28+
err := client.Do(ctx, client.B().Xadd().
29+
Key(streamKey).
30+
Id("*").
31+
FieldValue().
32+
FieldValue("field1", "value"+strconv.Itoa(i)).
33+
Build()).Error()
34+
if err != nil {
35+
b.Fatal(err)
36+
}
37+
}
38+
39+
// Benchmark 1: Using client.Do with AsXRangeSlices
40+
b.Run("Do_AsXRangeSlices", func(b *testing.B) {
41+
b.ResetTimer()
42+
b.ReportAllocs()
43+
44+
for b.Loop() {
45+
result := client.Do(ctx, client.B().Xrange().
46+
Key(streamKey).
47+
Start("-").
48+
End("+").
49+
Build())
50+
51+
if result.Error() != nil {
52+
b.Fatal(result.Error())
53+
}
54+
55+
entries, err := result.AsXRangeSlices()
56+
if err != nil {
57+
b.Fatal(err)
58+
}
59+
60+
if len(entries) != 1000 {
61+
b.Fatalf("expected 1000 entries, got %d", len(entries))
62+
}
63+
}
64+
})
65+
66+
// Benchmark 2: Using client.DoWithReader with resp package
67+
b.Run("DoWithReader_RespParse", func(b *testing.B) {
68+
b.ResetTimer()
69+
b.ReportAllocs()
70+
71+
for b.Loop() {
72+
var entryCount int
73+
74+
var results [][]byte
75+
err := client.DoWithReader(ctx, client.B().Xrange().
76+
Key(streamKey).
77+
Start("-").
78+
End("+").
79+
Build(), func(reader *bufio.Reader) error {
80+
81+
respReader := NewReader(reader)
82+
83+
// Expect array of entries
84+
count, err := respReader.ExpectArray()
85+
if err != nil {
86+
return err
87+
}
88+
89+
entryCount = int(count)
90+
results = make([][]byte, entryCount)
91+
92+
// Parse each entry
93+
for j := int64(0); j < count; j++ {
94+
// Each entry is a 2-element array [id, fields]
95+
if err := respReader.ExpectArrayWithLen(2); err != nil {
96+
return err
97+
}
98+
99+
// Read and discard ID
100+
if _, err := respReader.ReadStringBytes(); err != nil {
101+
return err
102+
}
103+
104+
// Read field-value pairs
105+
fieldCount, err := respReader.ExpectArray()
106+
if err != nil {
107+
return err
108+
}
109+
110+
if fieldCount != 2 {
111+
panic("expected 2 fields, got " + strconv.Itoa(int(fieldCount)))
112+
}
113+
114+
_, err = respReader.ReadStringBytes() // Key.
115+
if err != nil {
116+
return err
117+
}
118+
buf, err := respReader.ReadStringBytes() // Value.
119+
if err != nil {
120+
return err
121+
}
122+
// copy buf.
123+
safeBuf := make([]byte, len(buf))
124+
copy(safeBuf, buf)
125+
results[j] = safeBuf
126+
}
127+
128+
return nil
129+
})
130+
131+
if err != nil {
132+
b.Fatal(err)
133+
}
134+
135+
if len(results) != 1000 {
136+
b.Fatalf("expected 1000 entries, got %d", entryCount)
137+
}
138+
}
139+
})
140+
141+
// Cleanup
142+
client.Do(ctx, client.B().Del().Key(streamKey).Build())
143+
}

0 commit comments

Comments
 (0)