Commit 72621e58 authored by Geoff Simmons's avatar Geoff Simmons

Add parseInt64() for byte slices (with no allocations).

parent ee9c9637
......@@ -29,11 +29,28 @@
package log
const (
cutoff = ^uint32(0) / 10
rest = byte(^uint32(0)-cutoff*10) + byte('0')
cutoffU32 = ^uint32(0) / 10
restU32 = byte(^uint32(0)-cutoffU32*10) + byte('0')
maxSigned64 = int64(^uint64(1<<63))
cutoffDec64 = int64(maxSigned64 / 10)
cutoffOct64 = int64(1 << 60)
cutoffHex64 = int64(1 << 59)
restPosDec64 = byte(maxSigned64-cutoffDec64*10) + byte('0')
restNegDec64 = byte(restPosDec64 + 1)
ill = uint8(255)
)
var wsTable = wsTbl()
var (
wsTable = wsTbl()
hxTbl = [55]uint8{
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
ill, ill, ill, ill, ill, ill, ill, 10, 11, 12,
13, 14, 15, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill, ill, ill,
ill, ill, ill, ill, ill, ill, ill, ill, ill, 10,
11, 12, 13, 14, 15,
}
)
func wsTbl() [256]bool {
var tbl [256]bool
......@@ -52,11 +69,11 @@ func atoUint32(bytes []byte) (uint32, bool) {
}
val := uint32(0)
for _, b := range bytes {
if val >= cutoff {
if val > cutoff {
if val >= cutoffU32 {
if val > cutoffU32 {
return 0, false
}
if b > rest {
if b > restU32 {
return 0, false
}
}
......@@ -68,6 +85,116 @@ func atoUint32(bytes []byte) (uint32, bool) {
return val, true
}
func parseOct(bytes []byte, pos bool) (int64, bool) {
val := int64(0)
for _, b := range bytes {
if val >= cutoffOct64 {
if pos || val != cutoffOct64 || b != byte('0') {
return 0, false
}
}
if b < byte('0') || b > byte('7') {
if wsTable[b] {
break
}
return 0, false
}
val <<= 3
val |= int64(b-byte('0'))
}
if pos {
return val, true
}
return 0 - val, true
}
func parseHex(bytes []byte, pos bool) (int64, bool) {
val := int64(0)
for _, b := range bytes {
if val >= cutoffHex64 {
if pos || val != cutoffHex64 || b != byte('0') {
return 0, false
}
}
if b < byte('0') || b > byte('f') || hxTbl[b-byte('0')] == ill {
if wsTable[b] {
break
}
return 0, false
}
val <<= 4
val |= int64(hxTbl[b-byte('0')])
}
if pos {
return val, true
}
return 0 - val, true
}
func parseDec(bytes []byte, pos bool) (int64, bool) {
rest := restPosDec64
if !pos {
rest = restNegDec64
}
val := int64(0)
for _, b := range bytes {
if val >= cutoffDec64 {
if val > cutoffDec64 {
return 0, false
}
if b > rest {
return 0, false
}
}
if b < byte('0') || b > byte('9') {
if wsTable[b] {
break
}
return 0, false
}
val = val*10 + int64(b-byte('0'))
}
if pos {
return val, true
}
return 0 - val, true
}
// ParseInt(b, 0, 64), or strtoll(b, &p, 0), for byte slices.
// Only whitespace after the digits is permitted.
func parseInt64(bytes []byte) (int64, bool) {
l := len(bytes)
if l == 0 {
return 0, false
}
pos := true
i := 0
for ; i < l && wsTable[bytes[i]]; i++ {
}
if i == l {
return 0, false
}
if bytes[i] == byte('+') || bytes[i] == byte('-') {
if bytes[i] == byte('-') {
pos = false
}
i++
if i == l {
return 0, false
}
}
if bytes[i] == byte('0') {
if i == l {
return 0, true
}
if i+1 < l && bytes[i+1] == byte('x') {
return parseHex(bytes[i+2:], pos)
}
return parseOct(bytes[i+1:], pos)
}
return parseDec(bytes[i:], pos)
}
// Return the byte slice delimiters of the Nth whitespace-separated
// field in the given byte slice, counting fields from 0 and ignoring
// leading and trailing whitespace:
......
......@@ -96,7 +96,7 @@ func BenchmarkStrconvAtoi(b *testing.B) {
}
}
var delimVec = map[string][]struct{
var delimVec = map[string][]struct {
fld int
ok bool
exp string
......@@ -143,7 +143,7 @@ var delimVec = map[string][]struct{
{2, false, ""},
},
}
func TestFieldNDelims(t *testing.T) {
s := []byte("foo bar baz quux")
_, _, ok := fieldNDelims(s, 4)
......@@ -200,3 +200,378 @@ func BenchmarkBytesFields(b *testing.B) {
_ = bytes.Fields(s)
}
}
type parseInt64Exp struct {
val int64
ok bool
}
func TestParseInt64(t *testing.T) {
expMap := map[string]parseInt64Exp{
"": parseInt64Exp{val: 0, ok: false},
"0": parseInt64Exp{val: 0, ok: true},
"1": parseInt64Exp{val: 1, ok: true},
"9": parseInt64Exp{val: 9, ok: true},
"10": parseInt64Exp{val: 10, ok: true},
"101": parseInt64Exp{val: 101, ok: true},
"1009": parseInt64Exp{val: 1009, ok: true},
"foo": parseInt64Exp{val: 0, ok: false},
" foo ": parseInt64Exp{val: 0, ok: false},
"foo ": parseInt64Exp{val: 0, ok: false},
" foo": parseInt64Exp{val: 0, ok: false},
"4294967290": parseInt64Exp{val: 4294967290, ok: true},
"4294967291": parseInt64Exp{val: 4294967291, ok: true},
"4294967292": parseInt64Exp{val: 4294967292, ok: true},
"4294967293": parseInt64Exp{val: 4294967293, ok: true},
"4294967294": parseInt64Exp{val: 4294967294, ok: true},
"4294967295": parseInt64Exp{val: 4294967295, ok: true},
"4294967296": parseInt64Exp{val: 4294967296, ok: true},
"4294967297": parseInt64Exp{val: 4294967297, ok: true},
"4294967298": parseInt64Exp{val: 4294967298, ok: true},
"4294967299": parseInt64Exp{val: 4294967299, ok: true},
"+0": parseInt64Exp{val: 0, ok: true},
"+1": parseInt64Exp{val: 1, ok: true},
"+9": parseInt64Exp{val: 9, ok: true},
"+10": parseInt64Exp{val: 10, ok: true},
"+101": parseInt64Exp{val: 101, ok: true},
"+1009": parseInt64Exp{val: 1009, ok: true},
"+4294967299": parseInt64Exp{val: 4294967299, ok: true},
"-0": parseInt64Exp{val: 0, ok: true},
"-1": parseInt64Exp{val: -1, ok: true},
"-9": parseInt64Exp{val: -9, ok: true},
"-10": parseInt64Exp{val: -10, ok: true},
"-101": parseInt64Exp{val: -101, ok: true},
"-1009": parseInt64Exp{val: -1009, ok: true},
"-4294967299": parseInt64Exp{val: -4294967299, ok: true},
" +1": parseInt64Exp{val: 1, ok: true},
" -1": parseInt64Exp{val: -1, ok: true},
"00": parseInt64Exp{val: 0, ok: true},
"01": parseInt64Exp{val: 1, ok: true},
"02": parseInt64Exp{val: 2, ok: true},
"03": parseInt64Exp{val: 3, ok: true},
"04": parseInt64Exp{val: 4, ok: true},
"05": parseInt64Exp{val: 5, ok: true},
"06": parseInt64Exp{val: 6, ok: true},
"07": parseInt64Exp{val: 7, ok: true},
"08": parseInt64Exp{val: 0, ok: false},
"09": parseInt64Exp{val: 0, ok: false},
"010": parseInt64Exp{val: 8, ok: true},
"011": parseInt64Exp{val: 9, ok: true},
"012": parseInt64Exp{val: 10, ok: true},
"013": parseInt64Exp{val: 11, ok: true},
"014": parseInt64Exp{val: 12, ok: true},
"015": parseInt64Exp{val: 13, ok: true},
"016": parseInt64Exp{val: 14, ok: true},
"017": parseInt64Exp{val: 15, ok: true},
"0100": parseInt64Exp{val: 64, ok: true},
"0177": parseInt64Exp{val: 127, ok: true},
"01000": parseInt64Exp{val: 512, ok: true},
"01777": parseInt64Exp{val: 1023, ok: true},
"0187": parseInt64Exp{val: 0, ok: false},
"+00": parseInt64Exp{val: 0, ok: true},
"+01": parseInt64Exp{val: 1, ok: true},
"+02": parseInt64Exp{val: 2, ok: true},
"+03": parseInt64Exp{val: 3, ok: true},
"+04": parseInt64Exp{val: 4, ok: true},
"+05": parseInt64Exp{val: 5, ok: true},
"+06": parseInt64Exp{val: 6, ok: true},
"+07": parseInt64Exp{val: 7, ok: true},
"+08": parseInt64Exp{val: 0, ok: false},
"+09": parseInt64Exp{val: 0, ok: false},
"+010": parseInt64Exp{val: 8, ok: true},
"+011": parseInt64Exp{val: 9, ok: true},
"+012": parseInt64Exp{val: 10, ok: true},
"+013": parseInt64Exp{val: 11, ok: true},
"+014": parseInt64Exp{val: 12, ok: true},
"+015": parseInt64Exp{val: 13, ok: true},
"+016": parseInt64Exp{val: 14, ok: true},
"+017": parseInt64Exp{val: 15, ok: true},
"+0100": parseInt64Exp{val: 64, ok: true},
"+0177": parseInt64Exp{val: 127, ok: true},
"+01000": parseInt64Exp{val: 512, ok: true},
"+01777": parseInt64Exp{val: 1023, ok: true},
"-00": parseInt64Exp{val: 0, ok: true},
"-01": parseInt64Exp{val: -1, ok: true},
"-02": parseInt64Exp{val: -2, ok: true},
"-03": parseInt64Exp{val: -3, ok: true},
"-04": parseInt64Exp{val: -4, ok: true},
"-05": parseInt64Exp{val: -5, ok: true},
"-06": parseInt64Exp{val: -6, ok: true},
"-07": parseInt64Exp{val: -7, ok: true},
"-08": parseInt64Exp{val: 0, ok: false},
"-09": parseInt64Exp{val: 0, ok: false},
"-010": parseInt64Exp{val: -8, ok: true},
"-011": parseInt64Exp{val: -9, ok: true},
"-012": parseInt64Exp{val: -10, ok: true},
"-013": parseInt64Exp{val: -11, ok: true},
"-014": parseInt64Exp{val: -12, ok: true},
"-015": parseInt64Exp{val: -13, ok: true},
"-016": parseInt64Exp{val: -14, ok: true},
"-017": parseInt64Exp{val: -15, ok: true},
"-0100": parseInt64Exp{val: -64, ok: true},
"-0177": parseInt64Exp{val: -127, ok: true},
"-01000": parseInt64Exp{val: -512, ok: true},
"-01777": parseInt64Exp{val: -1023, ok: true},
" 01777 ": parseInt64Exp{val: 1023, ok: true},
" +01777 ": parseInt64Exp{val: 1023, ok: true},
" -01777 ": parseInt64Exp{val: -1023, ok: true},
"0x0": parseInt64Exp{val: 0, ok: true},
"0x1": parseInt64Exp{val: 1, ok: true},
"0x2": parseInt64Exp{val: 2, ok: true},
"0x3": parseInt64Exp{val: 3, ok: true},
"0x4": parseInt64Exp{val: 4, ok: true},
"0x5": parseInt64Exp{val: 5, ok: true},
"0x6": parseInt64Exp{val: 6, ok: true},
"0x7": parseInt64Exp{val: 7, ok: true},
"0x8": parseInt64Exp{val: 8, ok: true},
"0x9": parseInt64Exp{val: 9, ok: true},
"0xa": parseInt64Exp{val: 10, ok: true},
"0xb": parseInt64Exp{val: 11, ok: true},
"0xc": parseInt64Exp{val: 12, ok: true},
"0xd": parseInt64Exp{val: 13, ok: true},
"0xe": parseInt64Exp{val: 14, ok: true},
"0xf": parseInt64Exp{val: 15, ok: true},
"0xA": parseInt64Exp{val: 10, ok: true},
"0xB": parseInt64Exp{val: 11, ok: true},
"0xC": parseInt64Exp{val: 12, ok: true},
"0xD": parseInt64Exp{val: 13, ok: true},
"0xE": parseInt64Exp{val: 14, ok: true},
"0xF": parseInt64Exp{val: 15, ok: true},
"0xg": parseInt64Exp{val: 0, ok: false},
"0xG": parseInt64Exp{val: 0, ok: false},
"0x10": parseInt64Exp{val: 16, ok: true},
"0x11": parseInt64Exp{val: 17, ok: true},
"0x12": parseInt64Exp{val: 18, ok: true},
"0x100": parseInt64Exp{val: 256, ok: true},
"0x1fF": parseInt64Exp{val: 511, ok: true},
"0xdeadbeef": parseInt64Exp{val: 3735928559, ok: true},
"0xDeAdBeEf": parseInt64Exp{val: 3735928559, ok: true},
"0x1gF": parseInt64Exp{val: 0, ok: false},
"0x1=F": parseInt64Exp{val: 0, ok: false},
"+0x0": parseInt64Exp{val: 0, ok: true},
"+0x1": parseInt64Exp{val: 1, ok: true},
"+0x2": parseInt64Exp{val: 2, ok: true},
"+0x3": parseInt64Exp{val: 3, ok: true},
"+0x4": parseInt64Exp{val: 4, ok: true},
"+0x5": parseInt64Exp{val: 5, ok: true},
"+0x6": parseInt64Exp{val: 6, ok: true},
"+0x7": parseInt64Exp{val: 7, ok: true},
"+0x8": parseInt64Exp{val: 8, ok: true},
"+0x9": parseInt64Exp{val: 9, ok: true},
"+0xa": parseInt64Exp{val: 10, ok: true},
"+0xb": parseInt64Exp{val: 11, ok: true},
"+0xc": parseInt64Exp{val: 12, ok: true},
"+0xd": parseInt64Exp{val: 13, ok: true},
"+0xe": parseInt64Exp{val: 14, ok: true},
"+0xf": parseInt64Exp{val: 15, ok: true},
"+0xA": parseInt64Exp{val: 10, ok: true},
"+0xB": parseInt64Exp{val: 11, ok: true},
"+0xC": parseInt64Exp{val: 12, ok: true},
"+0xD": parseInt64Exp{val: 13, ok: true},
"+0xE": parseInt64Exp{val: 14, ok: true},
"+0xF": parseInt64Exp{val: 15, ok: true},
"+0x10": parseInt64Exp{val: 16, ok: true},
"+0x11": parseInt64Exp{val: 17, ok: true},
"+0x12": parseInt64Exp{val: 18, ok: true},
"+0x100": parseInt64Exp{val: 256, ok: true},
"+0x1fF": parseInt64Exp{val: 511, ok: true},
"+0xdeadbeef": parseInt64Exp{val: 3735928559, ok: true},
"+0xDeAdBeEf": parseInt64Exp{val: 3735928559, ok: true},
"-0x0": parseInt64Exp{val: 0, ok: true},
"-0x1": parseInt64Exp{val: -1, ok: true},
"-0x2": parseInt64Exp{val: -2, ok: true},
"-0x3": parseInt64Exp{val: -3, ok: true},
"-0x4": parseInt64Exp{val: -4, ok: true},
"-0x5": parseInt64Exp{val: -5, ok: true},
"-0x6": parseInt64Exp{val: -6, ok: true},
"-0x7": parseInt64Exp{val: -7, ok: true},
"-0x8": parseInt64Exp{val: -8, ok: true},
"-0x9": parseInt64Exp{val: -9, ok: true},
"-0xa": parseInt64Exp{val: -10, ok: true},
"-0xb": parseInt64Exp{val: -11, ok: true},
"-0xc": parseInt64Exp{val: -12, ok: true},
"-0xd": parseInt64Exp{val: -13, ok: true},
"-0xe": parseInt64Exp{val: -14, ok: true},
"-0xf": parseInt64Exp{val: -15, ok: true},
"-0xA": parseInt64Exp{val: -10, ok: true},
"-0xB": parseInt64Exp{val: -11, ok: true},
"-0xC": parseInt64Exp{val: -12, ok: true},
"-0xD": parseInt64Exp{val: -13, ok: true},
"-0xE": parseInt64Exp{val: -14, ok: true},
"-0xF": parseInt64Exp{val: -15, ok: true},
"-0x10": parseInt64Exp{val: -16, ok: true},
"-0x11": parseInt64Exp{val: -17, ok: true},
"-0x12": parseInt64Exp{val: -18, ok: true},
"-0x100": parseInt64Exp{val: -256, ok: true},
"-0x1fF": parseInt64Exp{val: -511, ok: true},
"-0xdeadbeef": parseInt64Exp{val: -3735928559, ok: true},
"-0xDeAdBeEf": parseInt64Exp{val: -3735928559, ok: true},
" +0x1 ": parseInt64Exp{val: 1, ok: true},
" -0x1 ": parseInt64Exp{val: -1, ok: true},
"0x1 ": parseInt64Exp{val: 1, ok: true},
" 0x1": parseInt64Exp{val: 1, ok: true},
" 1 2 ": parseInt64Exp{val: 1, ok: true},
" 1 foo ": parseInt64Exp{val: 1, ok: true},
" 1foo ": parseInt64Exp{val: 0, ok: false},
"9223372036854775800": parseInt64Exp{val: 9223372036854775800,
ok: true},
"9223372036854775801": parseInt64Exp{val: 9223372036854775801,
ok: true},
"9223372036854775802": parseInt64Exp{val: 9223372036854775802,
ok: true},
"9223372036854775803": parseInt64Exp{val: 9223372036854775803,
ok: true},
"9223372036854775804": parseInt64Exp{val: 9223372036854775804,
ok: true},
"9223372036854775805": parseInt64Exp{val: 9223372036854775805,
ok: true},
"9223372036854775806": parseInt64Exp{val: 9223372036854775806,
ok: true},
"9223372036854775807": parseInt64Exp{val: 9223372036854775807,
ok: true},
"9223372036854775808": parseInt64Exp{val: 0, ok: false},
"9223372036854775809": parseInt64Exp{val: 0, ok: false},
"9223372036854775810": parseInt64Exp{val: 0, ok: false},
"9223372036854775811": parseInt64Exp{val: 0, ok: false},
"+9223372036854775800": parseInt64Exp{val: 9223372036854775800,
ok: true},
"+9223372036854775801": parseInt64Exp{val: 9223372036854775801,
ok: true},
"+9223372036854775802": parseInt64Exp{val: 9223372036854775802,
ok: true},
"+9223372036854775803": parseInt64Exp{val: 9223372036854775803,
ok: true},
"+9223372036854775804": parseInt64Exp{val: 9223372036854775804,
ok: true},
"+9223372036854775805": parseInt64Exp{val: 9223372036854775805,
ok: true},
"+9223372036854775806": parseInt64Exp{val: 9223372036854775806,
ok: true},
"+9223372036854775807": parseInt64Exp{val: 9223372036854775807,
ok: true},
"+9223372036854775808": parseInt64Exp{val: 0, ok: false},
"+9223372036854775809": parseInt64Exp{val: 0, ok: false},
"+9223372036854775810": parseInt64Exp{val: 0, ok: false},
"+9223372036854775811": parseInt64Exp{val: 0, ok: false},
"-9223372036854775800": parseInt64Exp{val: -9223372036854775800,
ok: true},
"-9223372036854775801": parseInt64Exp{val: -9223372036854775801,
ok: true},
"-9223372036854775802": parseInt64Exp{val: -9223372036854775802,
ok: true},
"-9223372036854775803": parseInt64Exp{val: -9223372036854775803,
ok: true},
"-9223372036854775804": parseInt64Exp{val: -9223372036854775804,
ok: true},
"-9223372036854775805": parseInt64Exp{val: -9223372036854775805,
ok: true},
"-9223372036854775806": parseInt64Exp{val: -9223372036854775806,
ok: true},
"-9223372036854775807": parseInt64Exp{val: -9223372036854775807,
ok: true},
"-9223372036854775808": parseInt64Exp{val: -9223372036854775808,
ok: true},
"-9223372036854775809": parseInt64Exp{val: 0, ok: false},
"-9223372036854775810": parseInt64Exp{val: 0, ok: false},
"-9223372036854775820": parseInt64Exp{val: 0, ok: false},
"0777777777777777777770": parseInt64Exp{val: 9223372036854775800,
ok: true},
"0777777777777777777771": parseInt64Exp{val: 9223372036854775801,
ok: true},
"0777777777777777777772": parseInt64Exp{val: 9223372036854775802,
ok: true},
"0777777777777777777773": parseInt64Exp{val: 9223372036854775803,
ok: true},
"0777777777777777777774": parseInt64Exp{val: 9223372036854775804,
ok: true},
"0777777777777777777775": parseInt64Exp{val: 9223372036854775805,
ok: true},
"0777777777777777777776": parseInt64Exp{val: 9223372036854775806,
ok: true},
"0777777777777777777777": parseInt64Exp{val: 9223372036854775807,
ok: true},
"01000000000000000000000": parseInt64Exp{val: 0, ok: false},
"01000000000000000000001": parseInt64Exp{val: 0, ok: false},
"01000000000000000000002": parseInt64Exp{val: 0, ok: false},
"-0777777777777777777777": parseInt64Exp{val: -9223372036854775807,
ok: true},
"-01000000000000000000000": parseInt64Exp{val: -9223372036854775808,
ok: true},
"-01000000000000000000001": parseInt64Exp{val: 0, ok: false},
"-01000000000000000000002": parseInt64Exp{val: 0, ok: false},
"-01000000000000000000003": parseInt64Exp{val: 0, ok: false},
"0x7FFFFFFFFFFFFFF0": parseInt64Exp{val: 9223372036854775792,
ok: true},
"0x7FFFFFFFFFFFFFF1": parseInt64Exp{val: 9223372036854775793,
ok: true},
"0x7FFFFFFFFFFFFFF2": parseInt64Exp{val: 9223372036854775794,
ok: true},
"0x7FFFFFFFFFFFFFF3": parseInt64Exp{val: 9223372036854775795,
ok: true},
"0x7FFFFFFFFFFFFFF4": parseInt64Exp{val: 9223372036854775796,
ok: true},
"0x7FFFFFFFFFFFFFF5": parseInt64Exp{val: 9223372036854775797,
ok: true},
"0x7FFFFFFFFFFFFFF6": parseInt64Exp{val: 9223372036854775798,
ok: true},
"0x7FFFFFFFFFFFFFF7": parseInt64Exp{val: 9223372036854775799,
ok: true},
"0x7FFFFFFFFFFFFFF8": parseInt64Exp{val: 9223372036854775800,
ok: true},
"0x7FFFFFFFFFFFFFF9": parseInt64Exp{val: 9223372036854775801,
ok: true},
"0x7FFFFFFFFFFFFFFA": parseInt64Exp{val: 9223372036854775802,
ok: true},
"0x7FFFFFFFFFFFFFFB": parseInt64Exp{val: 9223372036854775803,
ok: true},
"0x7FFFFFFFFFFFFFFC": parseInt64Exp{val: 9223372036854775804,
ok: true},
"0x7FFFFFFFFFFFFFFD": parseInt64Exp{val: 9223372036854775805,
ok: true},
"0x7FFFFFFFFFFFFFFE": parseInt64Exp{val: 9223372036854775806,
ok: true},
"0x7FFFFFFFFFFFFFFF": parseInt64Exp{val: 9223372036854775807,
ok: true},
"0x8000000000000000": parseInt64Exp{val: 0, ok: false},
"0x8000000000000001": parseInt64Exp{val: 0, ok: false},
"0x8000000000000002": parseInt64Exp{val: 0, ok: false},
"-0x7FFFFFFFFFFFFFFE": parseInt64Exp{val: -9223372036854775806,
ok: true},
"-0x7FFFFFFFFFFFFFFF": parseInt64Exp{val: -9223372036854775807,
ok: true},
"-0x8000000000000000": parseInt64Exp{val: -9223372036854775808,
ok: true},
"-0x8000000000000001": parseInt64Exp{val: 0, ok: false},
"-0x8000000000000002": parseInt64Exp{val: 0, ok: false},
}
for str, exp := range expMap {
val, ok := parseInt64([]byte(str))
if val != exp.val || ok != exp.ok {
t.Errorf("parseInt64(%s) want=%v got=%v", str, exp,
parseInt64Exp{val: val, ok: ok})
}
}
}
func BenchmarkParseInt64(b *testing.B) {
s := []byte("9223372036854775807")
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, ok := parseInt64(s)
if !ok {
b.Fatal("parseInt64() failed to parse")
return
}
}
}
func BenchmarkStrconvParseInt(b *testing.B) {
s := []byte("9223372036854775807")
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _ = strconv.ParseInt(string(s), 0, 64)
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment