...
1 package proto_test
2
3 import (
4 "bytes"
5 "testing"
6
7 "github.com/go-redis/redis/internal/proto"
8 )
9
10 func BenchmarkReader_ParseReply_Status(b *testing.B) {
11 benchmarkParseReply(b, "+OK\r\n", nil, false)
12 }
13
14 func BenchmarkReader_ParseReply_Int(b *testing.B) {
15 benchmarkParseReply(b, ":1\r\n", nil, false)
16 }
17
18 func BenchmarkReader_ParseReply_Error(b *testing.B) {
19 benchmarkParseReply(b, "-Error message\r\n", nil, true)
20 }
21
22 func BenchmarkReader_ParseReply_String(b *testing.B) {
23 benchmarkParseReply(b, "$5\r\nhello\r\n", nil, false)
24 }
25
26 func BenchmarkReader_ParseReply_Slice(b *testing.B) {
27 benchmarkParseReply(b, "*2\r\n$5\r\nhello\r\n$5\r\nworld\r\n", multiBulkParse, false)
28 }
29
30 func benchmarkParseReply(b *testing.B, reply string, m proto.MultiBulkParse, wanterr bool) {
31 buf := new(bytes.Buffer)
32 for i := 0; i < b.N; i++ {
33 buf.WriteString(reply)
34 }
35 p := proto.NewReader(buf)
36 b.ResetTimer()
37
38 for i := 0; i < b.N; i++ {
39 _, err := p.ReadReply(m)
40 if !wanterr && err != nil {
41 b.Fatal(err)
42 }
43 }
44 }
45
46 func multiBulkParse(p *proto.Reader, n int64) (interface{}, error) {
47 vv := make([]interface{}, 0, n)
48 for i := int64(0); i < n; i++ {
49 v, err := p.ReadReply(multiBulkParse)
50 if err != nil {
51 return nil, err
52 }
53 vv = append(vv, v)
54 }
55 return vv, nil
56 }
57
View as plain text