From cd86c9914433e16bb7ee305bb9c8ee25f2d5bce4 Mon Sep 17 00:00:00 2001 From: Waldemar Quevedo Date: Thu, 7 Sep 2017 20:03:41 -0700 Subject: [PATCH] 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 --- server/util.go | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/server/util.go b/server/util.go index c46c883f..06730b4d 100644 --- a/server/util.go +++ b/server/util.go @@ -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 }