From 8b2f84393b50a2ac77ba36f847c52148f98b320f Mon Sep 17 00:00:00 2001 From: Ilya Tocar Date: Tue, 1 Aug 2017 15:12:54 -0500 Subject: [PATCH] encoding/base32: improve performance in common case MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Unroll loop to improve perfromance back to 1.8 level. name old time/op new time/op delta EncodeToString-6 63.0µs ± 3% 51.7µs ± 2% -17.94% (p=0.000 n=10+10) name old speed new speed delta EncodeToString-6 130MB/s ± 3% 159MB/s ± 2% +21.83% (p=0.000 n=10+10) Vs 1.8: EncodeToString-6 54.9µs ± 2% 51.7µs ± 2% -5.95% (p=0.000 n=10+10) name old speed new speed delta EncodeToString-6 149MB/s ± 2% 159MB/s ± 2% +6.32% (p=0.000 n=10+10) Fixes #21262 Change-Id: I41bf7e1f61041781386d16d573bffe1a7173c0c3 Reviewed-on: https://go-review.googlesource.com/52510 Run-TryBot: Ilya Tocar TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/encoding/base32/base32.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/encoding/base32/base32.go b/src/encoding/base32/base32.go index bf341b54f3..e72ba74983 100644 --- a/src/encoding/base32/base32.go +++ b/src/encoding/base32/base32.go @@ -130,8 +130,19 @@ func (enc *Encoding) Encode(dst, src []byte) { } // Encode 5-bit blocks using the base32 alphabet - for i := 0; i < 8; i++ { - if len(dst) > i { + size := len(dst) + if size >= 8 { + // Common case, unrolled for extra performance + dst[0] = enc.encode[b[0]] + dst[1] = enc.encode[b[1]] + dst[2] = enc.encode[b[2]] + dst[3] = enc.encode[b[3]] + dst[4] = enc.encode[b[4]] + dst[5] = enc.encode[b[5]] + dst[6] = enc.encode[b[6]] + dst[7] = enc.encode[b[7]] + } else { + for i := 0; i < size; i++ { dst[i] = enc.encode[b[i]] } } -- 2.48.1