Remove for loop in parseSize to enable inlining

Using a goto based loop makes it become a leaf function which can be
inlined, making us get a slight performance increase in the fast path.
See: https://github.com/golang/go/issues/14768
This commit is contained in:
Waldemar Quevedo
2017-09-07 20:03:41 -07:00
parent c7fc87659a
commit cd86c99144

View File

@@ -1,4 +1,4 @@
// Copyright 2012-2016 Apcera Inc. All rights reserved.
// Copyright 2012-2017 Apcera Inc. All rights reserved.
package server
@@ -20,16 +20,30 @@ const (
)
// parseSize expects decimal positive numbers. We
// return -1 to signal error
// return -1 to signal error.
func parseSize(d []byte) (n int) {
if len(d) == 0 {
l := len(d)
if l == 0 {
return -1
}
for _, dec := range d {
if dec < asciiZero || dec > asciiNine {
return -1
}
n = n*10 + (int(dec) - asciiZero)
var (
i int
dec byte
)
// Note: Use `goto` here to avoid for loop in order
// to have the function be inlined.
// See: https://github.com/golang/go/issues/14768
loop:
dec = d[i]
if dec < asciiZero || dec > asciiNine {
return -1
}
n = n*10 + (int(dec) - asciiZero)
i++
if i < l {
goto loop
}
return n
}