• Marvin Stenger's avatar
    bytes: optimize Buffer's Write, WriteString, WriteByte, and WriteRune · c08ac367
    Marvin Stenger authored
    In the common case, the grow method only needs to reslice the internal
    buffer. Making another function call to grow can be expensive when Write
    is called very often with small pieces of data (like a byte or rune).
    Thus, we add a tryGrowByReslice method that is inlineable so that we can
    avoid an extra call in most cases.
    
    name                       old time/op    new time/op    delta
    WriteByte-4                  35.5µs ± 0%    17.4µs ± 1%   -51.03%  (p=0.000 n=19+20)
    WriteRune-4                  55.7µs ± 1%    38.7µs ± 1%   -30.56%  (p=0.000 n=18+19)
    BufferNotEmptyWriteRead-4     304µs ± 5%     283µs ± 3%    -6.86%  (p=0.000 n=19+17)
    BufferFullSmallReads-4       87.0µs ± 5%    66.8µs ± 2%   -23.26%  (p=0.000 n=17+17)
    
    name                       old speed      new speed      delta
    WriteByte-4                 115MB/s ± 0%   235MB/s ± 1%  +104.19%  (p=0.000 n=19+20)
    WriteRune-4                 221MB/s ± 1%   318MB/s ± 1%   +44.01%  (p=0.000 n=18+19)
    
    Fixes #17857
    
    Change-Id: I08dfb10a1c7e001817729dbfcc951bda12fe8814
    Reviewed-on: https://go-review.googlesource.com/42813Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    c08ac367
buffer.go 14.3 KB