• Daniel Martí's avatar
    encoding/json: remove a bounds check in readValue · ab2f83c3
    Daniel Martí authored
    readValue is a hot function, clocking in at ~13% flat CPU use in
    CodeDecoder. In particular, looping over the bytes is slow. That's
    partially because the code contains a bounds check at the start of the
    loop.
    
    The source of the problem is that scanp is a signed integer, and comes
    from a field, so the compiler doesn't know that it's non-negative. Help
    it with a simple and comparatively cheap hint.
    
    While at it, use scanp as the index variable directly, removing the need
    for a duplicate index variable which is later added back into scanp.
    
    name           old time/op    new time/op    delta
    CodeDecoder-8    11.3ms ± 1%    11.2ms ± 1%  -0.98%  (p=0.000 n=9+9)
    
    name           old speed      new speed      delta
    CodeDecoder-8   172MB/s ± 1%   174MB/s ± 1%  +0.99%  (p=0.000 n=9+9)
    
    Updates #28923.
    
    Change-Id: I138f83babdf316fc97697cc18f595c3403c1ddb7
    Reviewed-on: https://go-review.googlesource.com/c/go/+/170939
    Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
    ab2f83c3
stream.go 12.5 KB