]> Cypherpunks repositories - gostls13.git/commit
encoding/hex: save allocation in DecodeString()
authorAgniva De Sarker <agnivade@yahoo.co.in>
Sun, 13 Aug 2017 18:15:04 +0000 (23:45 +0530)
committerIan Lance Taylor <iant@golang.org>
Tue, 15 Aug 2017 14:35:34 +0000 (14:35 +0000)
commit22cfe24aca80653b0e8efdd4a1aba1df00e8e72d
tree316975f90be4008b181c4bac8040a06906c34a88
parent2351bbfd3b11122936fc5858be826d1da413bab3
encoding/hex: save allocation in DecodeString()

The destination slice does not need to be created at all. The source
slice itself can be used as the destination because the decode loop
increments by one and then the 'seen' byte is not used anymore. Therefore
the decoded byte can be stored in that index of the source slice itself.

This trick cannot be applied to EncodeString() because in that case,
the destination slice is large than the source. And for a single byte
in the source slice, two bytes in the destination slice is written.

func BenchmarkDecodeString(b *testing.B) {
  for i := 0; i < b.N; i++ {
    DecodeString("0123456789abcdef")
  }
}

name          old time/op    new time/op    delta
DecodeString    71.0ns ± 6%    58.0ns ± 0%  -18.28%  (p=0.008 n=5+5)

name          old alloc/op   new alloc/op   delta
DecodeString     16.0B ± 0%      8.0B ± 0%  -50.00%  (p=0.008 n=5+5)

name          old allocs/op  new allocs/op  delta
DecodeString      1.00 ± 0%      1.00 ± 0%     ~     (all equal)

Change-Id: Id98db4e712444557a804155457a4dd8d1b8b416d
Reviewed-on: https://go-review.googlesource.com/55611
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
src/encoding/hex/hex.go