Skip to content

Commit 9a93baf

Browse files
kirillxianlancetaylor
authored andcommitted
encoding/base64: improve performance up to 20% total
Improve base64 encoding/decoding performance by suppressing compiler boundary checks on decode. name old speed new speed delta EncodeToString-8 570MB/s ± 1% 573MB/s ± 1% ~ (p=0.421 n=5+5) DecodeString/2-8 88.6MB/s ± 3% 91.6MB/s ± 2% +3.37% (p=0.016 n=5+5) DecodeString/4-8 162MB/s ± 1% 168MB/s ± 0% +4.12% (p=0.008 n=5+5) DecodeString/8-8 203MB/s ± 0% 214MB/s ± 0% +5.18% (p=0.008 n=5+5) DecodeString/64-8 471MB/s ± 1% 520MB/s ± 1% +10.50% (p=0.008 n=5+5) DecodeString/8192-8 757MB/s ± 0% 895MB/s ± 1% +18.29% (p=0.008 n=5+5) Change-Id: I135243c11aa4c974a4a4e95c5c2abb0635d52c8c GitHub-Last-Rev: 2c87abc GitHub-Pull-Request: #36910 Reviewed-on: https://go-review.googlesource.com/c/go/+/217117 Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent 0ee4b13 commit 9a93baf

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)