• Martin Möhrmann's avatar
    cmd/compile: replace eqstring with memequal · 3216e0ce
    Martin Möhrmann authored
    eqstring is only called for strings with equal lengths.
    Instead of pushing a pointer and length for each argument string
    on the stack we can omit pushing one of the lengths on the stack.
    
    Changing eqstrings signature to eqstring(*uint8, *uint8, int) bool
    to implement the above optimization would make it very similar to the
    existing memequal(*any, *any, uintptr) bool function.
    
    Since string lengths are positive we can avoid code redundancy and
    use memequal instead of using eqstring with an optimized signature.
    
    go command binary size reduced by 4128 bytes on amd64.
    
    name                          old time/op    new time/op    delta
    CompareStringEqual              6.03ns ± 1%    5.71ns ± 1%   -5.23%  (p=0.000 n=19+18)
    CompareStringIdentical          2.88ns ± 1%    3.22ns ± 7%  +11.86%  (p=0.000 n=20+20)
    CompareStringSameLength         4.31ns ± 1%    4.01ns ± 1%   -7.17%  (p=0.000 n=19+19)
    CompareStringDifferentLength    0.29ns ± 2%    0.29ns ± 2%     ~     (p=1.000 n=20+20)
    CompareStringBigUnaligned       64.3µs ± 2%    64.1µs ± 3%     ~     (p=0.164 n=20+19)
    CompareStringBig                61.9µs ± 1%    61.6µs ± 2%   -0.46%  (p=0.033 n=20+19)
    
    Change-Id: Ice15f3b937c981f0d3bc8479a9ea0d10658ac8df
    Reviewed-on: https://go-review.googlesource.com/53650
    Run-TryBot: Martin Möhrmann <moehrmann@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarKeith Randall <khr@golang.org>
    3216e0ce
asm_arm64.s 22.3 KB