• Agniva De Sarker's avatar
    encoding/hex: save allocation in DecodeString() · 22cfe24a
    Agniva De Sarker authored
    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/55611Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
    Run-TryBot: Ian Lance Taylor <iant@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    22cfe24a
hex.go 5.24 KB