• Daniel Martí's avatar
    encoding/base32: simplify and speed up decoder · e90e7a59
    Daniel Martí authored
    First, we can lift the enc.decodeMap nil check out of the loop.
    
    Second, we can make it clear to the compiler that 'in := src[0]' doesn't
    need a bounds check, by making len(src)==0 a single if check that always
    stops the loop. This is by far the largest speed-up.
    
    Third, we can use a dst slice index instead of reslicing dst, which
    removes work from the loop body.
    
    While at it, we can merge the two 'switch dlen' pieces of code, which
    simplifies the code and doesn't affect performance.
    
    name            old time/op    new time/op    delta
    DecodeString-8    80.2µs ± 0%    67.5µs ± 0%  -15.81%  (p=0.002 n=6+6)
    
    name            old speed      new speed      delta
    DecodeString-8   163MB/s ± 0%   194MB/s ± 0%  +18.78%  (p=0.002 n=6+6)
    
    Change-Id: Iefeaae94c03453f8760452b1da706a77b3522718
    Reviewed-on: https://go-review.googlesource.com/c/154422
    Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
    e90e7a59
base32.go 12.6 KB