mirror of
https://github.com/redis/go-redis.git
synced 2025-07-28 06:42:00 +03:00
parser: Optimize multi bulk request parsing.
This commit is contained in:
12
parser.go
12
parser.go
@ -114,16 +114,12 @@ func _parseReply(rd reader, useIfaceSlice bool) (interface{}, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if useIfaceSlice {
|
if useIfaceSlice {
|
||||||
vals := make([]interface{}, 0)
|
|
||||||
if len(line) == 2 && line[1] == '0' {
|
|
||||||
return vals, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
numReplies, err := strconv.ParseInt(string(line[1:]), 10, 64)
|
numReplies, err := strconv.ParseInt(string(line[1:]), 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vals := make([]interface{}, 0, numReplies)
|
||||||
for i := int64(0); i < numReplies; i++ {
|
for i := int64(0); i < numReplies; i++ {
|
||||||
v, err := parseReply(rd)
|
v, err := parseReply(rd)
|
||||||
if err == Nil {
|
if err == Nil {
|
||||||
@ -137,16 +133,12 @@ func _parseReply(rd reader, useIfaceSlice bool) (interface{}, error) {
|
|||||||
|
|
||||||
return vals, nil
|
return vals, nil
|
||||||
} else {
|
} else {
|
||||||
vals := make([]string, 0)
|
|
||||||
if len(line) == 2 && line[1] == '0' {
|
|
||||||
return vals, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
numReplies, err := strconv.ParseInt(string(line[1:]), 10, 64)
|
numReplies, err := strconv.ParseInt(string(line[1:]), 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vals := make([]string, 0, numReplies)
|
||||||
for i := int64(0); i < numReplies; i++ {
|
for i := int64(0); i < numReplies; i++ {
|
||||||
v, err := parseReply(rd)
|
v, err := parseReply(rd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -35,21 +35,17 @@ func (t *RequestTest) TearDownTest(c *C) {}
|
|||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
func (t *RequestTest) BenchmarkStatusReq(c *C) {
|
func (t *RequestTest) benchmarkReq(c *C, reqString string, req redis.Req, checker Checker, expected interface{}) {
|
||||||
c.StopTimer()
|
c.StopTimer()
|
||||||
|
|
||||||
lineReader := NewLineReader([]byte("+OK\r\n"))
|
lineReader := NewLineReader([]byte(reqString))
|
||||||
rd := bufio.NewReaderSize(lineReader, 1024)
|
rd := bufio.NewReaderSize(lineReader, 1024)
|
||||||
req := redis.NewStatusReq()
|
|
||||||
|
|
||||||
for i := 0; i < 10; i++ {
|
for i := 0; i < 10; i++ {
|
||||||
vI, err := req.ParseReply(rd)
|
vIface, err := req.ParseReply(rd)
|
||||||
c.Check(err, IsNil)
|
c.Check(err, IsNil)
|
||||||
c.Check(vI, Equals, "OK")
|
c.Check(vIface, checker, expected)
|
||||||
|
req.SetVal(vIface)
|
||||||
req.SetVal(vI)
|
|
||||||
c.Check(req.Err(), IsNil)
|
|
||||||
c.Check(req.Val(), Equals, "OK")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
c.StartTimer()
|
c.StartTimer()
|
||||||
@ -57,7 +53,23 @@ func (t *RequestTest) BenchmarkStatusReq(c *C) {
|
|||||||
for i := 0; i < c.N; i++ {
|
for i := 0; i < c.N; i++ {
|
||||||
v, _ := req.ParseReply(rd)
|
v, _ := req.ParseReply(rd)
|
||||||
req.SetVal(v)
|
req.SetVal(v)
|
||||||
req.Err()
|
|
||||||
req.Val()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *RequestTest) BenchmarkStatusReq(c *C) {
|
||||||
|
t.benchmarkReq(c, "+OK\r\n", redis.NewStatusReq(), Equals, "OK")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *RequestTest) BenchmarkStringReq(c *C) {
|
||||||
|
t.benchmarkReq(c, "$5\r\nhello\r\n", redis.NewStringReq(), Equals, "hello")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *RequestTest) BenchmarkStringSliceReq(c *C) {
|
||||||
|
t.benchmarkReq(
|
||||||
|
c,
|
||||||
|
"*2\r\n$5\r\nhello\r\n$5\r\nhello\r\n",
|
||||||
|
redis.NewStringSliceReq(),
|
||||||
|
DeepEquals,
|
||||||
|
[]string{"hello", "hello"},
|
||||||
|
)
|
||||||
|
}
|
Reference in New Issue
Block a user