• Josh Bleecher Snyder's avatar
    encoding/binary: simplify Read and Write · 2179e495
    Josh Bleecher Snyder authored
    There's no need to manually manage the backing slice for bs.
    Removing it simplifies the code, removes some allocations,
    and speeds it up slightly.
    
    Fixes #27403
    
    name                     old time/op    new time/op    delta
    ReadSlice1000Int32s-8      6.39µs ± 1%    6.31µs ± 1%   -1.37%  (p=0.000 n=27+27)
    ReadStruct-8               1.25µs ± 2%    1.23µs ± 2%   -1.06%  (p=0.003 n=30+29)
    ReadInts-8                  301ns ± 0%     297ns ± 1%   -1.21%  (p=0.000 n=27+30)
    WriteInts-8                 325ns ± 1%     320ns ± 1%   -1.59%  (p=0.000 n=26+29)
    WriteSlice1000Int32s-8     6.60µs ± 0%    6.52µs ± 0%   -1.23%  (p=0.000 n=28+27)
    PutUint16-8                0.72ns ± 2%    0.71ns ± 2%     ~     (p=0.286 n=30+30)
    PutUint32-8                0.71ns ± 1%    0.71ns ± 0%   -0.42%  (p=0.003 n=30+25)
    PutUint64-8                0.78ns ± 2%    0.78ns ± 0%   -0.55%  (p=0.001 n=30+27)
    LittleEndianPutUint16-8    0.57ns ± 0%    0.57ns ± 0%     ~     (all equal)
    LittleEndianPutUint32-8    0.57ns ± 0%    0.57ns ± 0%     ~     (all equal)
    LittleEndianPutUint64-8    0.57ns ± 0%    0.57ns ± 0%     ~     (all equal)
    PutUvarint32-8             23.1ns ± 1%    23.1ns ± 1%     ~     (p=0.925 n=26+29)
    PutUvarint64-8             57.5ns ± 2%    57.3ns ± 1%     ~     (p=0.338 n=30+26)
    [Geo mean]                 23.0ns         22.9ns        -0.61%
    
    name                     old speed      new speed      delta
    ReadSlice1000Int32s-8     626MB/s ± 1%   634MB/s ± 1%   +1.38%  (p=0.000 n=27+27)
    ReadStruct-8             60.2MB/s ± 2%  60.8MB/s ± 2%   +1.08%  (p=0.002 n=30+29)
    ReadInts-8                100MB/s ± 1%   101MB/s ± 1%   +1.24%  (p=0.000 n=27+30)
    WriteInts-8              92.2MB/s ± 1%  93.6MB/s ± 1%   +1.56%  (p=0.000 n=26+29)
    WriteSlice1000Int32s-8    606MB/s ± 0%   614MB/s ± 0%   +1.24%  (p=0.000 n=28+27)
    PutUint16-8              2.80GB/s ± 1%  2.80GB/s ± 1%     ~     (p=0.095 n=28+29)
    PutUint32-8              5.61GB/s ± 1%  5.62GB/s ± 1%     ~     (p=0.069 n=27+28)
    PutUint64-8              10.2GB/s ± 1%  10.2GB/s ± 0%   +0.15%  (p=0.039 n=27+27)
    LittleEndianPutUint16-8  3.50GB/s ± 1%  3.50GB/s ± 1%     ~     (p=0.552 n=30+29)
    LittleEndianPutUint32-8  7.01GB/s ± 1%  7.02GB/s ± 1%     ~     (p=0.160 n=29+27)
    LittleEndianPutUint64-8  14.0GB/s ± 1%  14.0GB/s ± 1%     ~     (p=0.413 n=29+29)
    PutUvarint32-8            174MB/s ± 1%   173MB/s ± 1%     ~     (p=0.648 n=25+30)
    PutUvarint64-8            139MB/s ± 2%   140MB/s ± 1%     ~     (p=0.271 n=30+26)
    [Geo mean]                906MB/s        911MB/s        +0.55%
    
    name                     old alloc/op   new alloc/op   delta
    ReadSlice1000Int32s-8      4.14kB ± 0%    4.13kB ± 0%   -0.19%  (p=0.000 n=30+30)
    ReadStruct-8                 200B ± 0%      200B ± 0%     ~     (all equal)
    ReadInts-8                  64.0B ± 0%     32.0B ± 0%  -50.00%  (p=0.000 n=30+30)
    WriteInts-8                  112B ± 0%       64B ± 0%  -42.86%  (p=0.000 n=30+30)
    WriteSlice1000Int32s-8     4.14kB ± 0%    4.13kB ± 0%   -0.19%  (p=0.000 n=30+30)
    PutUint16-8                 0.00B          0.00B          ~     (all equal)
    PutUint32-8                 0.00B          0.00B          ~     (all equal)
    PutUint64-8                 0.00B          0.00B          ~     (all equal)
    LittleEndianPutUint16-8     0.00B          0.00B          ~     (all equal)
    LittleEndianPutUint32-8     0.00B          0.00B          ~     (all equal)
    LittleEndianPutUint64-8     0.00B          0.00B          ~     (all equal)
    PutUvarint32-8              0.00B          0.00B          ~     (all equal)
    PutUvarint64-8              0.00B          0.00B          ~     (all equal)
    [Geo mean]                   476B           370B       -22.22%
    
    name                     old allocs/op  new allocs/op  delta
    ReadSlice1000Int32s-8        3.00 ± 0%      2.00 ± 0%  -33.33%  (p=0.000 n=30+30)
    ReadStruct-8                 16.0 ± 0%      16.0 ± 0%     ~     (all equal)
    ReadInts-8                   8.00 ± 0%      8.00 ± 0%     ~     (all equal)
    WriteInts-8                  14.0 ± 0%      14.0 ± 0%     ~     (all equal)
    WriteSlice1000Int32s-8       3.00 ± 0%      2.00 ± 0%  -33.33%  (p=0.000 n=30+30)
    PutUint16-8                  0.00           0.00          ~     (all equal)
    PutUint32-8                  0.00           0.00          ~     (all equal)
    PutUint64-8                  0.00           0.00          ~     (all equal)
    LittleEndianPutUint16-8      0.00           0.00          ~     (all equal)
    LittleEndianPutUint32-8      0.00           0.00          ~     (all equal)
    LittleEndianPutUint64-8      0.00           0.00          ~     (all equal)
    PutUvarint32-8               0.00           0.00          ~     (all equal)
    PutUvarint64-8               0.00           0.00          ~     (all equal)
    [Geo mean]                   6.94           5.90       -14.97%
    
    Change-Id: I3790b93e4190d98621d5f2c47e42929a18f56c2e
    Reviewed-on: https://go-review.googlesource.com/133135
    Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    2179e495
binary.go 16.7 KB