Skip to content

Commit 2c87abc

Browse files
committed
base64: avoid compliler boundary checks in the hot loop
Unfortunately compiler is not capable to realise that boundary checks are not necessary on each src[si+N] access. Selection of sub-slice helps. benchmark old MB/s new MB/s speedup BenchmarkEncodeToString-8 598.08 595.89 1.00x BenchmarkDecodeString/2-8 96.32 98.97 1.03x BenchmarkDecodeString/4-8 174.19 180.41 1.04x BenchmarkDecodeString/8-8 215.03 225.91 1.05x BenchmarkDecodeString/64-8 496.53 548.24 1.10x BenchmarkDecodeString/8192-8 778.83 916.62 1.18x
1 parent ae3f98c commit 2c87abc

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

src/encoding/base64/base64.go

+14-12
Original file line numberDiff line numberDiff line change
@@ -480,15 +480,16 @@ func (enc *Encoding) Decode(dst, src []byte) (n int, err error) {
480480

481481
si := 0
482482
for strconv.IntSize >= 64 && len(src)-si >= 8 && len(dst)-n >= 8 {
483+
src2 := src[si : si+8]
483484
if dn, ok := assemble64(
484-
enc.decodeMap[src[si+0]],
485-
enc.decodeMap[src[si+1]],
486-
enc.decodeMap[src[si+2]],
487-
enc.decodeMap[src[si+3]],
488-
enc.decodeMap[src[si+4]],
489-
enc.decodeMap[src[si+5]],
490-
enc.decodeMap[src[si+6]],
491-
enc.decodeMap[src[si+7]],
485+
enc.decodeMap[src2[0]],
486+
enc.decodeMap[src2[1]],
487+
enc.decodeMap[src2[2]],
488+
enc.decodeMap[src2[3]],
489+
enc.decodeMap[src2[4]],
490+
enc.decodeMap[src2[5]],
491+
enc.decodeMap[src2[6]],
492+
enc.decodeMap[src2[7]],
492493
); ok {
493494
binary.BigEndian.PutUint64(dst[n:], dn)
494495
n += 6
@@ -504,11 +505,12 @@ func (enc *Encoding) Decode(dst, src []byte) (n int, err error) {
504505
}
505506

506507
for len(src)-si >= 4 && len(dst)-n >= 4 {
508+
src2 := src[si : si+4]
507509
if dn, ok := assemble32(
508-
enc.decodeMap[src[si+0]],
509-
enc.decodeMap[src[si+1]],
510-
enc.decodeMap[src[si+2]],
511-
enc.decodeMap[src[si+3]],
510+
enc.decodeMap[src2[0]],
511+
enc.decodeMap[src2[1]],
512+
enc.decodeMap[src2[2]],
513+
enc.decodeMap[src2[3]],
512514
); ok {
513515
binary.BigEndian.PutUint32(dst[n:], dn)
514516
n += 3

0 commit comments

Comments
 (0)