mirror of
https://bitbucket.org/s_l_teichmann/mtsatellite
synced 2025-01-11 09:20:17 +01:00
Replaced expensive fmt.Sscanf call in redis client with strconv.ParseInt.
This commit is contained in:
parent
228bd9026b
commit
7f78feb9bd
@ -6,10 +6,13 @@ package common
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
|
"unicode"
|
||||||
)
|
)
|
||||||
|
|
||||||
type RedisClient struct {
|
type RedisClient struct {
|
||||||
@ -106,6 +109,16 @@ func isError(line []byte) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseSize is a cheaper replacement for fmt.Sscanf(string(line), "$%d\r\n", &size).
|
||||||
|
func parseSize(line []byte) (int, error) {
|
||||||
|
if len(line) < 1 || line[0] != '$' {
|
||||||
|
return 0, errors.New("Missing '$' at begin of line")
|
||||||
|
}
|
||||||
|
line = bytes.TrimFunc(line[1:], unicode.IsSpace)
|
||||||
|
v, err := strconv.ParseInt(string(line), 10, 0)
|
||||||
|
return int(v), err
|
||||||
|
}
|
||||||
|
|
||||||
func (client *RedisClient) readBulkString(data *[]byte) (size int, err error) {
|
func (client *RedisClient) readBulkString(data *[]byte) (size int, err error) {
|
||||||
var line []byte
|
var line []byte
|
||||||
if line, err = client.reader.ReadBytes('\n'); err != nil {
|
if line, err = client.reader.ReadBytes('\n'); err != nil {
|
||||||
@ -114,10 +127,7 @@ func (client *RedisClient) readBulkString(data *[]byte) (size int, err error) {
|
|||||||
if err = isError(line); err != nil {
|
if err = isError(line); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if _, err = fmt.Sscanf(string(line), "$%d\r\n", &size); err != nil {
|
if size, err = parseSize(line); err != nil || size <= 0 {
|
||||||
return
|
|
||||||
}
|
|
||||||
if size <= 0 {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if cap(*data) < size {
|
if cap(*data) < size {
|
||||||
@ -158,7 +168,7 @@ func (client *RedisClient) QueryCuboid(cuboid Cuboid, fn func(*Block)) (err erro
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
block.Coord = PlainToCoord(key)
|
block.Coord = PlainToCoord(key)
|
||||||
if size, err = client.readBulkString(&data); err != nil {
|
if size, err = client.readBulkString(&data); err != nil || size < 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
block.Data = data[0:size]
|
block.Data = data[0:size]
|
||||||
|
Loading…
Reference in New Issue
Block a user