aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/hex
diff options
context:
space:
mode:
authorDaniel Martí <mvdan@mvdan.cc>2018-11-25 23:02:28 +0000
committerDaniel Martí <mvdan@mvdan.cc>2019-03-05 17:40:09 +0000
commita563f2f4177e6b3b897ae0a1c452e53ffc245638 (patch)
treedeca33b83c068345056e30f5de547e77e7a17eeb /src/encoding/hex
parentebdc24c3d334132542daa7c57246389e0b259227 (diff)
downloadgo-a563f2f4177e6b3b897ae0a1c452e53ffc245638.tar.gz
go-a563f2f4177e6b3b897ae0a1c452e53ffc245638.zip
encoding/hex: simplify encoder arithmetic
Two additions are faster than two multiplications and one addition. The code seems simpler to me too, as it's more obvious that we advance two destination bytes for each source byte. name old time/op new time/op delta Encode/256-8 374ns ± 0% 331ns ± 0% -11.44% (p=0.008 n=5+5) Encode/1024-8 1.47µs ± 0% 1.29µs ± 0% -11.89% (p=0.004 n=6+5) Encode/4096-8 5.85µs ± 1% 5.15µs ± 0% -11.89% (p=0.004 n=6+5) Encode/16384-8 23.3µs ± 0% 20.6µs ± 0% -11.68% (p=0.004 n=6+5) Change-Id: Iabc63616c1d9fded55fa668ff41dd49efeaa2ea4 Reviewed-on: https://go-review.googlesource.com/c/go/+/151198 Run-TryBot: Daniel Martí <mvdan@mvdan.cc> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: roger peppe <rogpeppe@gmail.com>
Diffstat (limited to 'src/encoding/hex')
-rw-r--r--src/encoding/hex/hex.go9
-rw-r--r--src/encoding/hex/hex_test.go2
2 files changed, 7 insertions, 4 deletions
diff --git a/src/encoding/hex/hex.go b/src/encoding/hex/hex.go
index 7675de9bd9..fbba78ffd2 100644
--- a/src/encoding/hex/hex.go
+++ b/src/encoding/hex/hex.go
@@ -23,11 +23,12 @@ func EncodedLen(n int) int { return n * 2 }
// of bytes written to dst, but this value is always EncodedLen(len(src)).
// Encode implements hexadecimal encoding.
func Encode(dst, src []byte) int {
- for i, v := range src {
- dst[i*2] = hextable[v>>4]
- dst[i*2+1] = hextable[v&0x0f]
+ j := 0
+ for _, v := range src {
+ dst[j] = hextable[v>>4]
+ dst[j+1] = hextable[v&0x0f]
+ j += 2
}
-
return len(src) * 2
}
diff --git a/src/encoding/hex/hex_test.go b/src/encoding/hex/hex_test.go
index ba703cf1c1..dbb00b94ca 100644
--- a/src/encoding/hex/hex_test.go
+++ b/src/encoding/hex/hex_test.go
@@ -242,6 +242,7 @@ func BenchmarkEncode(b *testing.B) {
sink = make([]byte, 2*size)
b.Run(fmt.Sprintf("%v", size), func(b *testing.B) {
+ b.SetBytes(int64(size))
for i := 0; i < b.N; i++ {
Encode(sink, src)
}
@@ -269,6 +270,7 @@ func BenchmarkDump(b *testing.B) {
sink = make([]byte, 2*size)
b.Run(fmt.Sprintf("%v", size), func(b *testing.B) {
+ b.SetBytes(int64(size))
for i := 0; i < b.N; i++ {
Dump(src)
}