• Josh Bleecher Snyder's avatar
    math/big: allocate less for single-Word nats · bfc54bb6
    Josh Bleecher Snyder authored
    For many uses of math/big, most numbers are small in practice.
    Prior to this change, big.NewInt allocated a minimum of five Words:
    one to hold the value, and four as extra capacity.
    In most cases, this extra capacity is waste.
    Worse, allocating a single Word uses a fast malloc path for tiny allocs;
    allocating five Words is more expensive in CPU as well as memory.
    
    This change is a simple fix: Treat a request for one Word at its word.
    I experimented with more complicated fixes and did not find anything
    that outperformed this easy fix.
    
    On some real world programs, this is a clear win.
    
    The compiler:
    
    name        old alloc/op      new alloc/op      delta
    Template         37.1MB ± 0%       37.0MB ± 0%  -0.23%  (p=0.008 n=5+5)
    Unicode          29.2MB ± 0%       28.5MB ± 0%  -2.48%  (p=0.008 n=5+5)
    GoTypes           133MB ± 0%        133MB ± 0%  -0.05%  (p=0.008 n=5+5)
    Compiler          628MB ± 0%        628MB ± 0%  -0.06%  (p=0.008 n=5+5)
    SSA              2.04GB ± 0%       2.03GB ± 0%  -0.14%  (p=0.008 n=5+5)
    Flate            24.7MB ± 0%       24.6MB ± 0%  -0.23%  (p=0.008 n=5+5)
    GoParser         29.6MB ± 0%       29.6MB ± 0%  -0.07%  (p=0.008 n=5+5)
    Reflect          82.3MB ± 0%       82.2MB ± 0%  -0.05%  (p=0.008 n=5+5)
    Tar              36.2MB ± 0%       36.2MB ± 0%  -0.12%  (p=0.008 n=5+5)
    XML              49.5MB ± 0%       49.4MB ± 0%  -0.23%  (p=0.008 n=5+5)
    [Geo mean]       85.1MB            84.8MB       -0.37%
    
    name        old allocs/op     new allocs/op     delta
    Template           364k ± 0%         364k ± 0%    ~     (p=0.476 n=5+5)
    Unicode            341k ± 0%         341k ± 0%    ~     (p=0.690 n=5+5)
    GoTypes           1.37M ± 0%        1.37M ± 0%    ~     (p=0.444 n=5+5)
    Compiler          5.50M ± 0%        5.50M ± 0%  +0.02%  (p=0.008 n=5+5)
    SSA               16.0M ± 0%        16.0M ± 0%  +0.01%  (p=0.008 n=5+5)
    Flate              238k ± 0%         238k ± 0%    ~     (p=0.222 n=5+5)
    GoParser           305k ± 0%         305k ± 0%    ~     (p=0.841 n=5+5)
    Reflect            976k ± 0%         976k ± 0%    ~     (p=0.222 n=5+5)
    Tar                354k ± 0%         354k ± 0%    ~     (p=0.103 n=5+5)
    XML                450k ± 0%         450k ± 0%    ~     (p=0.151 n=5+5)
    [Geo mean]         837k              837k       +0.01%
    
    go.skylark.net (at ea6d2813de75ded8d157b9540bc3d3ad0b688623):
    
    name                     old alloc/op   new alloc/op   delta
    Hashtable-8                 456kB ± 0%     299kB ± 0%  -34.33%  (p=0.000 n=9+9)
    /bench_builtin_method-8     220kB ± 0%     190kB ± 0%  -13.55%  (p=0.000 n=9+10)
    
    name                     old allocs/op  new allocs/op  delta
    Hashtable-8                 7.84k ± 0%     7.84k ± 0%     ~     (all equal)
    /bench_builtin_method-8     7.49k ± 0%     7.49k ± 0%     ~     (all equal)
    
    The math/big benchmarks are messy, which is predictable, since they
    naturally exercise the bigger-than-one-word code more.
    Also worth noting is that many of the benchmarks have very high variance.
    I've omitted the opVV and opVW benchmarks, as they are unrelated.
    
    name                              old time/op    new time/op    delta
    DecimalConversion-8                 92.5µs ± 1%    90.6µs ± 0%   -2.12%  (p=0.000 n=17+19)
    FloatString/100-8                    867ns ± 0%     871ns ± 0%   +0.50%  (p=0.000 n=18+18)
    FloatString/1000-8                  26.4µs ± 1%    26.5µs ± 1%     ~     (p=0.396 n=20+19)
    FloatString/10000-8                 2.15ms ± 2%    2.16ms ± 2%     ~     (p=0.089 n=19+20)
    FloatString/100000-8                 209ms ± 1%     209ms ± 1%     ~     (p=0.583 n=19+19)
    FloatAdd/10-8                       63.5ns ± 2%    64.1ns ± 6%     ~     (p=0.389 n=19+19)
    FloatAdd/100-8                      66.0ns ± 2%    65.8ns ± 2%     ~     (p=0.825 n=20+20)
    FloatAdd/1000-8                     93.9ns ± 1%    94.3ns ± 1%     ~     (p=0.273 n=19+20)
    FloatAdd/10000-8                     347ns ± 2%     342ns ± 1%   -1.50%  (p=0.000 n=18+18)
    FloatAdd/100000-8                   2.78µs ± 1%    2.78µs ± 2%     ~     (p=0.961 n=20+19)
    FloatSub/10-8                       56.9ns ± 2%    57.8ns ± 3%   +1.59%  (p=0.001 n=19+19)
    FloatSub/100-8                      58.2ns ± 2%    58.9ns ± 2%   +1.25%  (p=0.004 n=20+20)
    FloatSub/1000-8                     74.9ns ± 1%    74.4ns ± 1%   -0.76%  (p=0.000 n=19+20)
    FloatSub/10000-8                     223ns ± 1%     220ns ± 2%   -1.29%  (p=0.000 n=16+20)
    FloatSub/100000-8                   1.66µs ± 1%    1.66µs ± 2%     ~     (p=0.147 n=20+20)
    ParseFloatSmallExp-8                8.38µs ± 0%    8.59µs ± 0%   +2.48%  (p=0.000 n=19+19)
    ParseFloatLargeExp-8                31.1µs ± 0%    32.0µs ± 0%   +3.04%  (p=0.000 n=16+17)
    GCD10x10/WithoutXY-8                 115ns ± 1%      99ns ± 3%  -14.07%  (p=0.000 n=20+20)
    GCD10x10/WithXY-8                    322ns ± 0%     312ns ± 0%   -3.11%  (p=0.000 n=18+13)
    GCD10x100/WithoutXY-8                233ns ± 1%     219ns ± 1%   -5.73%  (p=0.000 n=19+17)
    GCD10x100/WithXY-8                   709ns ± 0%     759ns ± 0%   +7.04%  (p=0.000 n=19+19)
    GCD10x1000/WithoutXY-8               653ns ± 1%     642ns ± 1%   -1.69%  (p=0.000 n=17+20)
    GCD10x1000/WithXY-8                 1.35µs ± 0%    1.35µs ± 1%     ~     (p=0.255 n=20+16)
    GCD10x10000/WithoutXY-8             4.57µs ± 1%    4.61µs ± 1%   +0.95%  (p=0.000 n=18+17)
    GCD10x10000/WithXY-8                6.82µs ± 0%    6.84µs ± 0%   +0.27%  (p=0.000 n=16+17)
    GCD10x100000/WithoutXY-8            43.9µs ± 1%    44.0µs ± 1%   +0.28%  (p=0.000 n=18+17)
    GCD10x100000/WithXY-8               60.6µs ± 0%    60.6µs ± 0%     ~     (p=0.907 n=18+18)
    GCD100x100/WithoutXY-8              1.13µs ± 0%    1.21µs ± 0%   +6.39%  (p=0.000 n=19+19)
    GCD100x100/WithXY-8                 1.82µs ± 0%    1.92µs ± 0%   +5.24%  (p=0.000 n=19+17)
    GCD100x1000/WithoutXY-8             2.00µs ± 0%    2.03µs ± 1%   +1.61%  (p=0.000 n=18+16)
    GCD100x1000/WithXY-8                3.22µs ± 0%    3.20µs ± 1%   -0.83%  (p=0.000 n=19+19)
    GCD100x10000/WithoutXY-8            9.28µs ± 1%    9.17µs ± 1%   -1.25%  (p=0.000 n=18+19)
    GCD100x10000/WithXY-8               13.5µs ± 0%    13.3µs ± 0%   -1.12%  (p=0.000 n=18+19)
    GCD100x100000/WithoutXY-8           80.4µs ± 0%    78.6µs ± 0%   -2.25%  (p=0.000 n=19+19)
    GCD100x100000/WithXY-8               114µs ± 0%     112µs ± 0%   -1.46%  (p=0.000 n=19+17)
    GCD1000x1000/WithoutXY-8            12.9µs ± 1%    12.9µs ± 2%   -0.50%  (p=0.014 n=20+19)
    GCD1000x1000/WithXY-8               19.6µs ± 1%    19.6µs ± 2%   -0.28%  (p=0.040 n=17+18)
    GCD1000x10000/WithoutXY-8           22.4µs ± 0%    22.4µs ± 2%     ~     (p=0.220 n=19+19)
    GCD1000x10000/WithXY-8              57.0µs ± 0%    56.5µs ± 0%   -0.87%  (p=0.000 n=20+20)
    GCD1000x100000/WithoutXY-8           116µs ± 0%     115µs ± 0%   -0.49%  (p=0.000 n=18+19)
    GCD1000x100000/WithXY-8              410µs ± 0%     411µs ± 0%     ~     (p=0.052 n=19+19)
    GCD10000x10000/WithoutXY-8           247µs ± 1%     244µs ± 1%   -0.92%  (p=0.000 n=19+19)
    GCD10000x10000/WithXY-8              476µs ± 1%     473µs ± 1%   -0.48%  (p=0.009 n=19+19)
    GCD10000x100000/WithoutXY-8          573µs ± 1%     571µs ± 1%   -0.45%  (p=0.012 n=20+20)
    GCD10000x100000/WithXY-8            3.35ms ± 1%    3.35ms ± 1%     ~     (p=0.444 n=20+19)
    GCD100000x100000/WithoutXY-8        12.0ms ± 2%    11.9ms ± 2%     ~     (p=0.276 n=18+20)
    GCD100000x100000/WithXY-8           27.3ms ± 1%    27.3ms ± 1%     ~     (p=0.792 n=20+19)
    Hilbert-8                            672µs ± 0%     611µs ± 0%   -9.02%  (p=0.000 n=19+19)
    Binomial-8                          1.40µs ± 0%    1.18µs ± 0%  -15.69%  (p=0.000 n=16+14)
    QuoRem-8                            2.20µs ± 1%    2.17µs ± 1%   -1.13%  (p=0.000 n=19+19)
    Exp-8                               4.10ms ± 1%    4.11ms ± 1%     ~     (p=0.296 n=20+19)
    Exp2-8                              4.11ms ± 1%    4.12ms ± 1%     ~     (p=0.429 n=20+20)
    Bitset-8                            8.67ns ± 6%    8.74ns ± 4%     ~     (p=0.139 n=19+17)
    BitsetNeg-8                         43.6ns ± 1%    43.8ns ± 2%   +0.61%  (p=0.036 n=20+20)
    BitsetOrig-8                        77.5ns ± 1%    68.4ns ± 1%  -11.77%  (p=0.000 n=19+20)
    BitsetNegOrig-8                      145ns ± 1%     141ns ± 1%   -2.87%  (p=0.000 n=19+20)
    ModSqrt225_Tonelli-8                 324µs ± 1%     324µs ± 1%     ~     (p=0.409 n=18+20)
    ModSqrt225_3Mod4-8                  98.9µs ± 1%    99.1µs ± 1%     ~     (p=0.298 n=19+18)
    ModSqrt231_Tonelli-8                 337µs ± 1%     337µs ± 1%     ~     (p=0.718 n=20+18)
    ModSqrt231_5Mod8-8                   115µs ± 1%     114µs ± 1%   -0.22%  (p=0.050 n=20+20)
    ModInverse-8                         895ns ± 0%     869ns ± 1%   -2.83%  (p=0.000 n=17+17)
    Sqrt-8                              28.1µs ± 1%    28.1µs ± 0%   -0.28%  (p=0.000 n=16+20)
    IntSqr/1-8                          10.8ns ± 3%    10.5ns ± 3%   -2.51%  (p=0.000 n=19+17)
    IntSqr/2-8                          30.5ns ± 2%    30.3ns ± 4%   -0.71%  (p=0.035 n=18+18)
    IntSqr/3-8                          40.1ns ± 1%    40.1ns ± 1%     ~     (p=0.710 n=20+17)
    IntSqr/5-8                          65.3ns ± 1%    65.4ns ± 2%     ~     (p=0.744 n=19+19)
    IntSqr/8-8                           101ns ± 1%     102ns ± 0%     ~     (p=0.234 n=19+20)
    IntSqr/10-8                          138ns ± 0%     138ns ± 2%     ~     (p=0.827 n=18+18)
    IntSqr/20-8                          378ns ± 1%     378ns ± 1%     ~     (p=0.479 n=18+18)
    IntSqr/30-8                          637ns ± 0%     638ns ± 1%     ~     (p=0.051 n=18+20)
    IntSqr/50-8                         1.34µs ± 2%    1.34µs ± 1%     ~     (p=0.970 n=18+19)
    IntSqr/80-8                         2.78µs ± 0%    2.78µs ± 1%   -0.18%  (p=0.006 n=19+17)
    IntSqr/100-8                        3.98µs ± 0%    3.98µs ± 0%     ~     (p=0.057 n=17+19)
    IntSqr/200-8                        13.5µs ± 0%    13.5µs ± 1%   -0.33%  (p=0.000 n=19+17)
    IntSqr/300-8                        25.3µs ± 1%    25.3µs ± 1%     ~     (p=0.361 n=19+20)
    IntSqr/500-8                        62.9µs ± 0%    62.9µs ± 1%     ~     (p=0.899 n=17+17)
    IntSqr/800-8                         128µs ± 1%     127µs ± 1%   -0.32%  (p=0.016 n=18+20)
    IntSqr/1000-8                        192µs ± 0%     192µs ± 1%     ~     (p=0.916 n=17+18)
    Div/20/10-8                         34.9ns ± 2%    35.6ns ± 1%   +2.01%  (p=0.000 n=20+20)
    Div/200/100-8                        218ns ± 1%     215ns ± 2%   -1.43%  (p=0.000 n=18+18)
    Div/2000/1000-8                     1.16µs ± 1%    1.15µs ± 1%   -1.04%  (p=0.000 n=19+20)
    Div/20000/10000-8                   35.7µs ± 1%    35.4µs ± 1%   -0.69%  (p=0.000 n=19+18)
    Div/200000/100000-8                 2.89ms ± 1%    2.88ms ± 1%   -0.62%  (p=0.007 n=19+20)
    Mul-8                               9.28ms ± 1%    9.27ms ± 1%     ~     (p=0.563 n=18+18)
    ZeroShifts/Shl-8                     712ns ± 6%     716ns ± 7%     ~     (p=0.597 n=20+20)
    ZeroShifts/ShlSame-8                4.00ns ± 1%    4.06ns ± 5%     ~     (p=0.162 n=18+20)
    ZeroShifts/Shr-8                     714ns ±10%   1285ns ±156%     ~     (p=0.250 n=20+20)
    ZeroShifts/ShrSame-8                4.00ns ± 1%    4.09ns ±10%   +2.34%  (p=0.048 n=16+19)
    Exp3Power/0x10-8                     154ns ± 0%     159ns ±13%     ~     (p=0.197 n=14+20)
    Exp3Power/0x40-8                     171ns ± 1%     175ns ± 8%     ~     (p=0.058 n=16+19)
    Exp3Power/0x100-8                    287ns ± 0%     316ns ± 4%  +10.03%  (p=0.000 n=17+19)
    Exp3Power/0x400-8                    698ns ± 1%     801ns ± 6%  +14.75%  (p=0.000 n=19+20)
    Exp3Power/0x1000-8                  2.87µs ± 0%    3.65µs ± 6%  +27.24%  (p=0.000 n=18+18)
    Exp3Power/0x4000-8                  21.9µs ± 1%    28.7µs ± 8%  +31.09%  (p=0.000 n=18+20)
    Exp3Power/0x10000-8                  204µs ± 0%     267µs ± 9%  +30.81%  (p=0.000 n=20+20)
    Exp3Power/0x40000-8                 1.86ms ± 0%    2.26ms ± 5%  +21.68%  (p=0.000 n=18+19)
    Exp3Power/0x100000-8                17.5ms ± 1%    20.7ms ± 7%  +18.39%  (p=0.000 n=19+20)
    Exp3Power/0x400000-8                 156ms ± 0%     172ms ± 6%  +10.54%  (p=0.000 n=19+20)
    Fibo-8                              26.9ms ± 1%    27.5ms ± 3%   +2.32%  (p=0.000 n=19+19)
    NatSqr/1-8                          31.0ns ± 4%    39.5ns ±29%  +27.25%  (p=0.000 n=20+19)
    NatSqr/2-8                          54.1ns ± 1%    69.0ns ±28%  +27.52%  (p=0.000 n=20+20)
    NatSqr/3-8                          66.6ns ± 1%    83.0ns ±25%  +24.59%  (p=0.000 n=20+20)
    NatSqr/5-8                          97.1ns ± 1%   119.9ns ±12%  +23.50%  (p=0.000 n=16+20)
    NatSqr/8-8                           138ns ± 1%     171ns ± 9%  +24.20%  (p=0.000 n=19+20)
    NatSqr/10-8                          182ns ± 0%     225ns ± 9%  +23.50%  (p=0.000 n=16+20)
    NatSqr/20-8                          447ns ± 1%     624ns ± 6%  +39.64%  (p=0.000 n=19+19)
    NatSqr/30-8                          736ns ± 2%     986ns ± 9%  +33.94%  (p=0.000 n=19+20)
    NatSqr/50-8                         1.51µs ± 2%    1.97µs ± 9%  +30.42%  (p=0.000 n=20+20)
    NatSqr/80-8                         3.03µs ± 1%    3.67µs ± 7%  +21.08%  (p=0.000 n=20+20)
    NatSqr/100-8                        4.31µs ± 1%    5.20µs ± 7%  +20.52%  (p=0.000 n=19+20)
    NatSqr/200-8                        14.2µs ± 0%    16.3µs ± 4%  +14.92%  (p=0.000 n=19+20)
    NatSqr/300-8                        27.8µs ± 1%    33.2µs ± 7%  +19.28%  (p=0.000 n=20+18)
    NatSqr/500-8                        66.6µs ± 1%    74.5µs ± 3%  +11.87%  (p=0.000 n=18+18)
    NatSqr/800-8                         135µs ± 1%     165µs ± 7%  +22.33%  (p=0.000 n=20+20)
    NatSqr/1000-8                        200µs ± 0%     228µs ± 3%  +14.39%  (p=0.000 n=19+20)
    NatSetBytes/8-8                     8.87ns ± 4%    8.77ns ± 2%   -1.17%  (p=0.020 n=20+16)
    NatSetBytes/24-8                    38.6ns ± 3%    49.5ns ±29%  +28.32%  (p=0.000 n=18+19)
    NatSetBytes/128-8                   75.2ns ± 1%   120.7ns ±29%  +60.60%  (p=0.000 n=17+20)
    NatSetBytes/7-8                     16.2ns ± 2%    16.5ns ± 2%   +1.76%  (p=0.000 n=20+20)
    NatSetBytes/23-8                    46.5ns ± 1%    60.2ns ±24%  +29.59%  (p=0.000 n=20+20)
    NatSetBytes/127-8                   83.1ns ± 1%   118.2ns ±20%  +42.33%  (p=0.000 n=18+20)
    ScanPi-8                            89.1µs ± 1%   117.4µs ±12%  +31.75%  (p=0.000 n=18+20)
    StringPiParallel-8                  35.1µs ± 9%    40.2µs ±12%  +14.53%  (p=0.000 n=20+20)
    Scan/10/Base2-8                      410ns ±14%     429ns ±10%   +4.47%  (p=0.018 n=19+20)
    Scan/100/Base2-8                    3.05µs ±20%    2.97µs ±14%     ~     (p=0.449 n=20+20)
    Scan/1000/Base2-8                   29.3µs ± 8%    30.1µs ±23%     ~     (p=0.355 n=20+20)
    Scan/10000/Base2-8                   402µs ±13%     395µs ±14%     ~     (p=0.355 n=20+20)
    Scan/100000/Base2-8                 11.8ms ±10%    11.6ms ± 1%     ~     (p=0.245 n=17+18)
    Scan/10/Base8-8                      194ns ± 6%     196ns ±12%     ~     (p=0.829 n=20+19)
    Scan/100/Base8-8                    1.11µs ±15%    1.11µs ±12%     ~     (p=0.743 n=20+20)
    Scan/1000/Base8-8                   11.7µs ±10%    11.7µs ±12%     ~     (p=0.904 n=20+20)
    Scan/10000/Base8-8                   209µs ± 7%     210µs ± 8%     ~     (p=0.478 n=20+20)
    Scan/100000/Base8-8                 10.6ms ± 7%    10.4ms ± 6%     ~     (p=0.112 n=20+18)
    Scan/10/Base10-8                     182ns ±12%     188ns ±11%   +3.52%  (p=0.044 n=20+20)
    Scan/100/Base10-8                   1.01µs ± 8%    1.00µs ±13%     ~     (p=0.588 n=20+20)
    Scan/1000/Base10-8                  10.7µs ±20%    10.6µs ±14%     ~     (p=0.560 n=20+20)
    Scan/10000/Base10-8                  195µs ±10%     194µs ± 9%     ~     (p=0.883 n=20+20)
    Scan/100000/Base10-8                10.6ms ± 2%    10.6ms ± 2%     ~     (p=0.495 n=20+20)
    Scan/10/Base16-8                     166ns ±10%     174ns ±17%     ~     (p=0.072 n=20+20)
    Scan/100/Base16-8                    836ns ±10%     826ns ±12%     ~     (p=0.562 n=20+17)
    Scan/1000/Base16-8                  8.96µs ±13%    8.65µs ± 9%     ~     (p=0.203 n=20+18)
    Scan/10000/Base16-8                  198µs ± 3%     198µs ± 5%     ~     (p=0.718 n=20+20)
    Scan/100000/Base16-8                11.1ms ± 3%    11.0ms ± 4%     ~     (p=0.512 n=20+20)
    String/10/Base2-8                   88.1ns ± 7%    94.1ns ±11%   +6.80%  (p=0.000 n=19+20)
    String/100/Base2-8                   577ns ± 4%     598ns ± 5%   +3.72%  (p=0.000 n=20+20)
    String/1000/Base2-8                 5.25µs ± 2%    5.62µs ± 5%   +7.04%  (p=0.000 n=19+20)
    String/10000/Base2-8                55.6µs ± 1%    60.1µs ± 2%   +8.12%  (p=0.000 n=19+19)
    String/100000/Base2-8                519µs ± 2%     560µs ± 2%   +7.91%  (p=0.000 n=18+17)
    String/10/Base8-8                   52.2ns ± 8%    53.3ns ±12%     ~     (p=0.188 n=20+18)
    String/100/Base8-8                   218ns ± 3%     232ns ±10%   +6.66%  (p=0.000 n=20+20)
    String/1000/Base8-8                 1.84µs ± 3%    1.94µs ± 4%   +5.07%  (p=0.000 n=20+18)
    String/10000/Base8-8                18.1µs ± 2%    19.1µs ± 3%   +5.84%  (p=0.000 n=20+19)
    String/100000/Base8-8                184µs ± 2%     197µs ± 1%   +7.15%  (p=0.000 n=19+19)
    String/10/Base10-8                   158ns ± 7%     146ns ± 6%   -7.65%  (p=0.000 n=20+19)
    String/100/Base10-8                  807ns ± 2%     845ns ± 4%   +4.79%  (p=0.000 n=20+19)
    String/1000/Base10-8                3.99µs ± 3%    3.99µs ± 7%     ~     (p=0.920 n=20+20)
    String/10000/Base10-8               20.8µs ± 6%    22.1µs ±10%   +6.11%  (p=0.000 n=19+20)
    String/100000/Base10-8              5.60ms ± 2%    5.59ms ± 2%     ~     (p=0.749 n=20+19)
    String/10/Base16-8                  49.0ns ±13%    49.3ns ±16%     ~     (p=0.581 n=19+20)
    String/100/Base16-8                  173ns ± 5%     185ns ± 6%   +6.63%  (p=0.000 n=20+18)
    String/1000/Base16-8                1.38µs ± 3%    1.49µs ±10%   +8.27%  (p=0.000 n=19+20)
    String/10000/Base16-8               13.5µs ± 2%    14.5µs ± 3%   +7.08%  (p=0.000 n=20+20)
    String/100000/Base16-8               138µs ± 4%     148µs ± 4%   +7.57%  (p=0.000 n=19+20)
    LeafSize/0-8                        2.74ms ± 1%    2.79ms ± 2%   +2.00%  (p=0.000 n=19+19)
    LeafSize/1-8                        24.8µs ± 4%    26.1µs ± 8%   +5.33%  (p=0.000 n=18+19)
    LeafSize/2-8                        24.9µs ± 7%    25.0µs ± 8%     ~     (p=0.989 n=20+19)
    LeafSize/3-8                        97.6µs ± 3%   100.2µs ± 5%   +2.66%  (p=0.001 n=20+19)
    LeafSize/4-8                        25.2µs ± 5%    25.4µs ± 5%     ~     (p=0.173 n=19+20)
    LeafSize/5-8                         118µs ± 2%     119µs ± 5%     ~     (p=0.478 n=20+20)
    LeafSize/6-8                        97.6µs ± 3%   100.1µs ± 8%   +2.65%  (p=0.021 n=20+19)
    LeafSize/7-8                        65.6µs ± 5%    67.5µs ± 6%   +2.92%  (p=0.003 n=20+19)
    LeafSize/8-8                        25.5µs ± 5%    25.6µs ± 6%     ~     (p=0.461 n=19+20)
    LeafSize/9-8                         134µs ± 4%     136µs ± 5%     ~     (p=0.194 n=19+20)
    LeafSize/10-8                        119µs ± 3%     122µs ± 3%   +2.52%  (p=0.000 n=20+19)
    LeafSize/11-8                        115µs ± 5%     116µs ± 5%     ~     (p=0.158 n=20+19)
    LeafSize/12-8                       97.4µs ± 4%   100.3µs ± 5%   +2.91%  (p=0.003 n=19+20)
    LeafSize/13-8                       93.1µs ± 4%    93.0µs ± 6%     ~     (p=0.698 n=20+20)
    LeafSize/14-8                       67.0µs ± 3%    69.7µs ± 6%   +4.10%  (p=0.000 n=20+20)
    LeafSize/15-8                       48.3µs ± 2%    49.3µs ± 6%   +1.91%  (p=0.014 n=19+20)
    LeafSize/16-8                       25.6µs ± 5%    25.6µs ± 6%     ~     (p=0.947 n=20+20)
    LeafSize/32-8                       30.1µs ± 4%    30.3µs ± 5%     ~     (p=0.685 n=18+19)
    LeafSize/64-8                       53.4µs ± 2%    54.0µs ± 3%     ~     (p=0.053 n=19+19)
    ProbablyPrime/n=0-8                 3.59ms ± 1%    3.55ms ± 1%   -1.12%  (p=0.000 n=20+18)
    ProbablyPrime/n=1-8                 4.21ms ± 2%    4.17ms ± 2%   -0.73%  (p=0.018 n=20+19)
    ProbablyPrime/n=5-8                 6.74ms ± 1%    6.72ms ± 1%     ~     (p=0.102 n=20+20)
    ProbablyPrime/n=10-8                9.91ms ± 1%    9.89ms ± 2%     ~     (p=0.322 n=19+20)
    ProbablyPrime/n=20-8                16.2ms ± 1%    16.1ms ± 2%   -0.52%  (p=0.006 n=19+19)
    ProbablyPrime/Lucas-8               2.94ms ± 1%    2.95ms ± 1%   +0.52%  (p=0.002 n=18+19)
    ProbablyPrime/MillerRabinBase2-8     641µs ± 2%     640µs ± 2%     ~     (p=0.607 n=19+20)
    FloatSqrt/64-8                       653ns ± 5%     704ns ± 5%   +7.82%  (p=0.000 n=19+20)
    FloatSqrt/128-8                     1.32µs ± 3%    1.42µs ± 5%   +7.29%  (p=0.000 n=18+20)
    FloatSqrt/256-8                     1.44µs ± 2%    1.45µs ± 4%     ~     (p=0.089 n=19+19)
    FloatSqrt/1000-8                    3.36µs ± 3%    3.42µs ± 5%   +1.82%  (p=0.012 n=20+20)
    FloatSqrt/10000-8                   25.5µs ± 2%    27.5µs ± 7%   +7.91%  (p=0.000 n=18+19)
    FloatSqrt/100000-8                   629µs ± 6%     663µs ± 9%   +5.32%  (p=0.000 n=18+20)
    FloatSqrt/1000000-8                 46.4ms ± 2%    46.6ms ± 5%     ~     (p=0.351 n=20+19)
    [Geo mean]                          9.60µs        10.01µs        +4.28%
    
    name                              old alloc/op   new alloc/op   delta
    DecimalConversion-8                 54.0kB ± 0%    43.6kB ± 0%  -19.40%  (p=0.000 n=20+20)
    FloatString/100-8                     400B ± 0%      400B ± 0%     ~     (all equal)
    FloatString/1000-8                  3.10kB ± 0%    3.10kB ± 0%     ~     (all equal)
    FloatString/10000-8                 52.1kB ± 0%    52.1kB ± 0%     ~     (p=0.153 n=20+20)
    FloatString/100000-8                 582kB ± 0%     582kB ± 0%     ~     (all equal)
    FloatAdd/10-8                        0.00B          0.00B          ~     (all equal)
    FloatAdd/100-8                       0.00B          0.00B          ~     (all equal)
    FloatAdd/1000-8                      0.00B          0.00B          ~     (all equal)
    FloatAdd/10000-8                     0.00B          0.00B          ~     (all equal)
    FloatAdd/100000-8                    0.00B          0.00B          ~     (all equal)
    FloatSub/10-8                        0.00B          0.00B          ~     (all equal)
    FloatSub/100-8                       0.00B          0.00B          ~     (all equal)
    FloatSub/1000-8                      0.00B          0.00B          ~     (all equal)
    FloatSub/10000-8                     0.00B          0.00B          ~     (all equal)
    FloatSub/100000-8                    0.00B          0.00B          ~     (all equal)
    ParseFloatSmallExp-8                4.18kB ± 0%    3.60kB ± 0%  -13.79%  (p=0.000 n=20+20)
    ParseFloatLargeExp-8                18.9kB ± 0%    19.3kB ± 0%   +2.25%  (p=0.000 n=20+20)
    GCD10x10/WithoutXY-8                 96.0B ± 0%     16.0B ± 0%  -83.33%  (p=0.000 n=20+20)
    GCD10x10/WithXY-8                     240B ± 0%       88B ± 0%  -63.33%  (p=0.000 n=20+20)
    GCD10x100/WithoutXY-8                 192B ± 0%      112B ± 0%  -41.67%  (p=0.000 n=20+20)
    GCD10x100/WithXY-8                    464B ± 0%      424B ± 0%   -8.62%  (p=0.000 n=20+20)
    GCD10x1000/WithoutXY-8                416B ± 0%      336B ± 0%  -19.23%  (p=0.000 n=20+20)
    GCD10x1000/WithXY-8                 1.25kB ± 0%    1.10kB ± 0%  -12.18%  (p=0.000 n=20+20)
    GCD10x10000/WithoutXY-8             2.91kB ± 0%    2.83kB ± 0%   -2.75%  (p=0.000 n=20+20)
    GCD10x10000/WithXY-8                8.70kB ± 0%    8.55kB ± 0%   -1.76%  (p=0.000 n=16+16)
    GCD10x100000/WithoutXY-8            27.2kB ± 0%    27.2kB ± 0%   -0.29%  (p=0.000 n=20+20)
    GCD10x100000/WithXY-8               82.4kB ± 0%    82.3kB ± 0%   -0.17%  (p=0.000 n=20+19)
    GCD100x100/WithoutXY-8                288B ± 0%      384B ± 0%  +33.33%  (p=0.000 n=20+20)
    GCD100x100/WithXY-8                   464B ± 0%      576B ± 0%  +24.14%  (p=0.000 n=20+20)
    GCD100x1000/WithoutXY-8               640B ± 0%      688B ± 0%   +7.50%  (p=0.000 n=20+20)
    GCD100x1000/WithXY-8                1.52kB ± 0%    1.46kB ± 0%   -3.68%  (p=0.000 n=20+20)
    GCD100x10000/WithoutXY-8            4.24kB ± 0%    4.29kB ± 0%   +1.13%  (p=0.000 n=20+20)
    GCD100x10000/WithXY-8               11.1kB ± 0%    11.0kB ± 0%   -0.51%  (p=0.000 n=15+20)
    GCD100x100000/WithoutXY-8           40.9kB ± 0%    40.9kB ± 0%   +0.12%  (p=0.000 n=20+19)
    GCD100x100000/WithXY-8               110kB ± 0%     109kB ± 0%   -0.08%  (p=0.000 n=20+20)
    GCD1000x1000/WithoutXY-8            1.22kB ± 0%    1.06kB ± 0%  -13.16%  (p=0.000 n=20+20)
    GCD1000x1000/WithXY-8               2.37kB ± 0%    2.11kB ± 0%  -10.83%  (p=0.000 n=20+20)
    GCD1000x10000/WithoutXY-8           4.71kB ± 0%    4.63kB ± 0%   -1.70%  (p=0.000 n=20+19)
    GCD1000x10000/WithXY-8              28.2kB ± 0%    28.0kB ± 0%   -0.43%  (p=0.000 n=20+15)
    GCD1000x100000/WithoutXY-8          41.3kB ± 0%    41.2kB ± 0%   -0.20%  (p=0.000 n=20+16)
    GCD1000x100000/WithXY-8              301kB ± 0%     301kB ± 0%   -0.13%  (p=0.000 n=20+20)
    GCD10000x10000/WithoutXY-8          8.64kB ± 0%    8.48kB ± 0%   -1.85%  (p=0.000 n=20+20)
    GCD10000x10000/WithXY-8             57.2kB ± 0%    57.7kB ± 0%   +0.80%  (p=0.000 n=20+20)
    GCD10000x100000/WithoutXY-8         43.8kB ± 0%    43.7kB ± 0%   -0.19%  (p=0.000 n=20+18)
    GCD10000x100000/WithXY-8            2.08MB ± 0%    2.08MB ± 0%   -0.02%  (p=0.000 n=15+19)
    GCD100000x100000/WithoutXY-8        81.6kB ± 0%    81.4kB ± 0%   -0.20%  (p=0.000 n=20+20)
    GCD100000x100000/WithXY-8           4.32MB ± 0%    4.33MB ± 0%   +0.12%  (p=0.000 n=20+20)
    Hilbert-8                            653kB ± 0%     313kB ± 0%  -52.13%  (p=0.000 n=19+20)
    Binomial-8                          1.82kB ± 0%    1.02kB ± 0%  -43.86%  (p=0.000 n=20+20)
    QuoRem-8                             0.00B          0.00B          ~     (all equal)
    Exp-8                               11.1kB ± 0%    11.0kB ± 0%   -0.34%  (p=0.000 n=19+20)
    Exp2-8                              11.3kB ± 0%    11.3kB ± 0%   -0.35%  (p=0.000 n=19+20)
    Bitset-8                             0.00B          0.00B          ~     (all equal)
    BitsetNeg-8                          0.00B          0.00B          ~     (all equal)
    BitsetOrig-8                          103B ± 0%       63B ± 0%  -38.83%  (p=0.000 n=20+20)
    BitsetNegOrig-8                       215B ± 0%      175B ± 0%  -18.60%  (p=0.000 n=20+20)
    ModSqrt225_Tonelli-8                11.3kB ± 0%    11.0kB ± 0%   -2.76%  (p=0.000 n=20+17)
    ModSqrt225_3Mod4-8                  3.57kB ± 0%    3.53kB ± 0%   -1.12%  (p=0.000 n=20+20)
    ModSqrt231_Tonelli-8                11.0kB ± 0%    10.7kB ± 0%   -2.55%  (p=0.000 n=20+20)
    ModSqrt231_5Mod8-8                  4.21kB ± 0%    4.09kB ± 0%   -2.85%  (p=0.000 n=16+20)
    ModInverse-8                        1.44kB ± 0%    1.28kB ± 0%  -11.11%  (p=0.000 n=20+20)
    Sqrt-8                              6.00kB ± 0%    6.00kB ± 0%     ~     (all equal)
    IntSqr/1-8                           0.00B          0.00B          ~     (all equal)
    IntSqr/2-8                           0.00B          0.00B          ~     (all equal)
    IntSqr/3-8                           0.00B          0.00B          ~     (all equal)
    IntSqr/5-8                           0.00B          0.00B          ~     (all equal)
    IntSqr/8-8                           0.00B          0.00B          ~     (all equal)
    IntSqr/10-8                          0.00B          0.00B          ~     (all equal)
    IntSqr/20-8                           320B ± 0%      320B ± 0%     ~     (all equal)
    IntSqr/30-8                           480B ± 0%      480B ± 0%     ~     (all equal)
    IntSqr/50-8                           896B ± 0%      896B ± 0%     ~     (all equal)
    IntSqr/80-8                         1.28kB ± 0%    1.28kB ± 0%     ~     (all equal)
    IntSqr/100-8                        1.79kB ± 0%    1.79kB ± 0%     ~     (all equal)
    IntSqr/200-8                        3.20kB ± 0%    3.20kB ± 0%     ~     (all equal)
    IntSqr/300-8                        8.06kB ± 0%    8.06kB ± 0%     ~     (all equal)
    IntSqr/500-8                        12.3kB ± 0%    12.3kB ± 0%     ~     (all equal)
    IntSqr/800-8                        28.8kB ± 0%    28.8kB ± 0%     ~     (all equal)
    IntSqr/1000-8                       36.9kB ± 0%    36.9kB ± 0%     ~     (all equal)
    Div/20/10-8                          0.00B          0.00B          ~     (all equal)
    Div/200/100-8                        0.00B          0.00B          ~     (all equal)
    Div/2000/1000-8                      0.00B          0.00B          ~     (all equal)
    Div/20000/10000-8                    0.00B          0.00B          ~     (all equal)
    Div/200000/100000-8                   690B ± 0%      690B ± 0%     ~     (all equal)
    Mul-8                                565kB ± 0%     565kB ± 0%     ~     (all equal)
    ZeroShifts/Shl-8                    6.53kB ± 0%    6.53kB ± 0%     ~     (all equal)
    ZeroShifts/ShlSame-8                 0.00B          0.00B          ~     (all equal)
    ZeroShifts/Shr-8                    6.53kB ± 0%    6.53kB ± 0%     ~     (all equal)
    ZeroShifts/ShrSame-8                 0.00B          0.00B          ~     (all equal)
    Exp3Power/0x10-8                      192B ± 0%      112B ± 0%  -41.67%  (p=0.000 n=20+20)
    Exp3Power/0x40-8                      192B ± 0%      112B ± 0%  -41.67%  (p=0.000 n=20+20)
    Exp3Power/0x100-8                     288B ± 0%      208B ± 0%  -27.78%  (p=0.000 n=20+20)
    Exp3Power/0x400-8                     672B ± 0%      592B ± 0%  -11.90%  (p=0.000 n=20+20)
    Exp3Power/0x1000-8                  3.33kB ± 0%    3.25kB ± 0%   -2.40%  (p=0.000 n=20+20)
    Exp3Power/0x4000-8                  13.8kB ± 0%    13.7kB ± 0%   -0.58%  (p=0.000 n=20+20)
    Exp3Power/0x10000-8                  117kB ± 0%     117kB ± 0%   -0.07%  (p=0.000 n=20+20)
    Exp3Power/0x40000-8                  755kB ± 0%     755kB ± 0%   -0.01%  (p=0.000 n=19+20)
    Exp3Power/0x100000-8                5.22MB ± 0%    5.22MB ± 0%   -0.00%  (p=0.000 n=20+20)
    Exp3Power/0x400000-8                39.8MB ± 0%    39.8MB ± 0%   -0.00%  (p=0.000 n=20+19)
    Fibo-8                              3.09MB ± 0%    3.08MB ± 0%   -0.28%  (p=0.000 n=20+16)
    NatSqr/1-8                           48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    NatSqr/2-8                           64.0B ± 0%     64.0B ± 0%     ~     (all equal)
    NatSqr/3-8                           80.0B ± 0%     80.0B ± 0%     ~     (all equal)
    NatSqr/5-8                            112B ± 0%      112B ± 0%     ~     (all equal)
    NatSqr/8-8                            160B ± 0%      160B ± 0%     ~     (all equal)
    NatSqr/10-8                           192B ± 0%      192B ± 0%     ~     (all equal)
    NatSqr/20-8                           672B ± 0%      672B ± 0%     ~     (all equal)
    NatSqr/30-8                           992B ± 0%      992B ± 0%     ~     (all equal)
    NatSqr/50-8                         1.79kB ± 0%    1.79kB ± 0%     ~     (all equal)
    NatSqr/80-8                         2.69kB ± 0%    2.69kB ± 0%     ~     (all equal)
    NatSqr/100-8                        3.58kB ± 0%    3.58kB ± 0%     ~     (all equal)
    NatSqr/200-8                        6.66kB ± 0%    6.66kB ± 0%     ~     (all equal)
    NatSqr/300-8                        24.4kB ± 0%    24.4kB ± 0%     ~     (all equal)
    NatSqr/500-8                        36.9kB ± 0%    36.9kB ± 0%     ~     (all equal)
    NatSqr/800-8                        69.8kB ± 0%    69.8kB ± 0%     ~     (all equal)
    NatSqr/1000-8                       86.0kB ± 0%    86.0kB ± 0%     ~     (all equal)
    NatSetBytes/8-8                      0.00B          0.00B          ~     (all equal)
    NatSetBytes/24-8                     64.0B ± 0%     64.0B ± 0%     ~     (all equal)
    NatSetBytes/128-8                     160B ± 0%      160B ± 0%     ~     (all equal)
    NatSetBytes/7-8                      0.00B          0.00B          ~     (all equal)
    NatSetBytes/23-8                     64.0B ± 0%     64.0B ± 0%     ~     (all equal)
    NatSetBytes/127-8                     160B ± 0%      160B ± 0%     ~     (all equal)
    ScanPi-8                            75.4kB ± 0%    75.7kB ± 0%   +0.41%  (p=0.000 n=20+20)
    StringPiParallel-8                  20.4kB ± 0%    20.4kB ± 0%     ~     (p=0.223 n=20+20)
    Scan/10/Base2-8                      48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/100/Base2-8                     48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/1000/Base2-8                    48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/10000/Base2-8                   48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/100000/Base2-8                  48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/10/Base8-8                      48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/100/Base8-8                     48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/1000/Base8-8                    48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/10000/Base8-8                   48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/100000/Base8-8                  48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/10/Base10-8                     48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/100/Base10-8                    48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/1000/Base10-8                   48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/10000/Base10-8                  48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/100000/Base10-8                 48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/10/Base16-8                     48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/100/Base16-8                    48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/1000/Base16-8                   48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/10000/Base16-8                  48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    Scan/100000/Base16-8                 48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    String/10/Base2-8                    48.0B ± 0%     48.0B ± 0%     ~     (all equal)
    String/100/Base2-8                    352B ± 0%      352B ± 0%     ~     (all equal)
    String/1000/Base2-8                 3.46kB ± 0%    3.46kB ± 0%     ~     (all equal)
    String/10000/Base2-8                41.0kB ± 0%    41.0kB ± 0%     ~     (all equal)
    String/100000/Base2-8                336kB ± 0%     336kB ± 0%     ~     (all equal)
    String/10/Base8-8                    16.0B ± 0%     16.0B ± 0%     ~     (all equal)
    String/100/Base8-8                    112B ± 0%      112B ± 0%     ~     (all equal)
    String/1000/Base8-8                 1.15kB ± 0%    1.15kB ± 0%     ~     (all equal)
    String/10000/Base8-8                12.3kB ± 0%    12.3kB ± 0%     ~     (all equal)
    String/100000/Base8-8                115kB ± 0%     115kB ± 0%     ~     (all equal)
    String/10/Base10-8                   64.0B ± 0%     24.0B ± 0%  -62.50%  (p=0.000 n=20+20)
    String/100/Base10-8                   192B ± 0%      192B ± 0%     ~     (all equal)
    String/1000/Base10-8                1.95kB ± 0%    1.95kB ± 0%     ~     (all equal)
    String/10000/Base10-8               20.0kB ± 0%    20.0kB ± 0%     ~     (p=0.983 n=19+20)
    String/100000/Base10-8               210kB ± 1%     211kB ± 1%   +0.82%  (p=0.000 n=19+20)
    String/10/Base16-8                   16.0B ± 0%     16.0B ± 0%     ~     (all equal)
    String/100/Base16-8                  96.0B ± 0%     96.0B ± 0%     ~     (all equal)
    String/1000/Base16-8                  896B ± 0%      896B ± 0%     ~     (all equal)
    String/10000/Base16-8               9.47kB ± 0%    9.47kB ± 0%     ~     (all equal)
    String/100000/Base16-8              90.1kB ± 0%    90.1kB ± 0%     ~     (all equal)
    LeafSize/0-8                        16.9kB ± 0%    16.8kB ± 0%   -0.44%  (p=0.000 n=20+20)
    LeafSize/1-8                        22.4kB ± 0%    22.3kB ± 0%   -0.34%  (p=0.000 n=20+19)
    LeafSize/2-8                        22.4kB ± 0%    22.3kB ± 0%   -0.34%  (p=0.000 n=20+19)
    LeafSize/3-8                        22.4kB ± 0%    22.3kB ± 0%   -0.34%  (p=0.000 n=20+17)
    LeafSize/4-8                        22.4kB ± 0%    22.3kB ± 0%   -0.34%  (p=0.000 n=20+19)
    LeafSize/5-8                        22.4kB ± 0%    22.3kB ± 0%   -0.33%  (p=0.000 n=20+20)
    LeafSize/6-8                        22.3kB ± 0%    22.2kB ± 0%   -0.34%  (p=0.000 n=20+20)
    LeafSize/7-8                        22.3kB ± 0%    22.2kB ± 0%   -0.35%  (p=0.000 n=20+20)
    LeafSize/8-8                        22.3kB ± 0%    22.2kB ± 0%   -0.34%  (p=0.000 n=16+20)
    LeafSize/9-8                        22.3kB ± 0%    22.2kB ± 0%   -0.33%  (p=0.000 n=20+20)
    LeafSize/10-8                       22.3kB ± 0%    22.2kB ± 0%   -0.33%  (p=0.000 n=20+20)
    LeafSize/11-8                       22.3kB ± 0%    22.2kB ± 0%   -0.33%  (p=0.000 n=20+20)
    LeafSize/12-8                       22.3kB ± 0%    22.2kB ± 0%   -0.33%  (p=0.000 n=20+20)
    LeafSize/13-8                       22.3kB ± 0%    22.2kB ± 0%   -0.34%  (p=0.000 n=20+15)
    LeafSize/14-8                       22.3kB ± 0%    22.2kB ± 0%   -0.33%  (p=0.000 n=20+20)
    LeafSize/15-8                       22.3kB ± 0%    22.2kB ± 0%   -0.33%  (p=0.000 n=20+20)
    LeafSize/16-8                       22.3kB ± 0%    22.2kB ± 0%   -0.33%  (p=0.000 n=19+20)
    LeafSize/32-8                       22.3kB ± 0%    22.2kB ± 0%   -0.32%  (p=0.000 n=20+20)
    LeafSize/64-8                       21.8kB ± 0%    21.7kB ± 0%   -0.33%  (p=0.000 n=18+19)
    ProbablyPrime/n=0-8                 15.3kB ± 0%    14.9kB ± 0%   -2.35%  (p=0.000 n=20+20)
    ProbablyPrime/n=1-8                 21.0kB ± 0%    20.7kB ± 0%   -1.71%  (p=0.000 n=20+20)
    ProbablyPrime/n=5-8                 43.4kB ± 0%    42.9kB ± 0%   -1.20%  (p=0.000 n=20+20)
    ProbablyPrime/n=10-8                71.5kB ± 0%    70.7kB ± 0%   -1.01%  (p=0.000 n=19+20)
    ProbablyPrime/n=20-8                 127kB ± 0%     126kB ± 0%   -0.88%  (p=0.000 n=20+20)
    ProbablyPrime/Lucas-8               3.07kB ± 0%    2.79kB ± 0%   -9.12%  (p=0.000 n=20+20)
    ProbablyPrime/MillerRabinBase2-8    12.1kB ± 0%    12.0kB ± 0%   -0.66%  (p=0.000 n=20+20)
    FloatSqrt/64-8                        416B ± 0%      360B ± 0%  -13.46%  (p=0.000 n=20+20)
    FloatSqrt/128-8                       640B ± 0%      584B ± 0%   -8.75%  (p=0.000 n=20+20)
    FloatSqrt/256-8                       512B ± 0%      472B ± 0%   -7.81%  (p=0.000 n=20+20)
    FloatSqrt/1000-8                    1.47kB ± 0%    1.43kB ± 0%   -2.72%  (p=0.000 n=20+20)
    FloatSqrt/10000-8                   18.2kB ± 0%    18.1kB ± 0%   -0.22%  (p=0.000 n=20+20)
    FloatSqrt/100000-8                   204kB ± 0%     204kB ± 0%   -0.02%  (p=0.000 n=20+20)
    FloatSqrt/1000000-8                 6.37MB ± 0%    6.37MB ± 0%   -0.00%  (p=0.000 n=19+20)
    [Geo mean]                          3.42kB         3.24kB        -5.33%
    
    name                              old allocs/op  new allocs/op  delta
    DecimalConversion-8                  1.65k ± 0%     1.65k ± 0%     ~     (all equal)
    FloatString/100-8                     8.00 ± 0%      8.00 ± 0%     ~     (all equal)
    FloatString/1000-8                    9.00 ± 0%      9.00 ± 0%     ~     (all equal)
    FloatString/10000-8                   22.0 ± 0%      22.0 ± 0%     ~     (all equal)
    FloatString/100000-8                   136 ± 0%       136 ± 0%     ~     (all equal)
    FloatAdd/10-8                         0.00           0.00          ~     (all equal)
    FloatAdd/100-8                        0.00           0.00          ~     (all equal)
    FloatAdd/1000-8                       0.00           0.00          ~     (all equal)
    FloatAdd/10000-8                      0.00           0.00          ~     (all equal)
    FloatAdd/100000-8                     0.00           0.00          ~     (all equal)
    FloatSub/10-8                         0.00           0.00          ~     (all equal)
    FloatSub/100-8                        0.00           0.00          ~     (all equal)
    FloatSub/1000-8                       0.00           0.00          ~     (all equal)
    FloatSub/10000-8                      0.00           0.00          ~     (all equal)
    FloatSub/100000-8                     0.00           0.00          ~     (all equal)
    ParseFloatSmallExp-8                   110 ± 0%       130 ± 0%  +18.18%  (p=0.000 n=20+20)
    ParseFloatLargeExp-8                   319 ± 0%       371 ± 0%  +16.30%  (p=0.000 n=20+20)
    GCD10x10/WithoutXY-8                  2.00 ± 0%      2.00 ± 0%     ~     (all equal)
    GCD10x10/WithXY-8                     5.00 ± 0%      6.00 ± 0%  +20.00%  (p=0.000 n=20+20)
    GCD10x100/WithoutXY-8                 4.00 ± 0%      4.00 ± 0%     ~     (all equal)
    GCD10x100/WithXY-8                    9.00 ± 0%     12.00 ± 0%  +33.33%  (p=0.000 n=20+20)
    GCD10x1000/WithoutXY-8                4.00 ± 0%      4.00 ± 0%     ~     (all equal)
    GCD10x1000/WithXY-8                   11.0 ± 0%      12.0 ± 0%   +9.09%  (p=0.000 n=20+20)
    GCD10x10000/WithoutXY-8               4.00 ± 0%      4.00 ± 0%     ~     (all equal)
    GCD10x10000/WithXY-8                  11.0 ± 0%      12.0 ± 0%   +9.09%  (p=0.000 n=20+20)
    GCD10x100000/WithoutXY-8              4.00 ± 0%      4.00 ± 0%     ~     (all equal)
    GCD10x100000/WithXY-8                 11.0 ± 0%      12.0 ± 0%   +9.09%  (p=0.000 n=20+20)
    GCD100x100/WithoutXY-8                6.00 ± 0%     10.00 ± 0%  +66.67%  (p=0.000 n=20+20)
    GCD100x100/WithXY-8                   9.00 ± 0%     15.00 ± 0%  +66.67%  (p=0.000 n=20+20)
    GCD100x1000/WithoutXY-8               6.00 ± 0%      8.00 ± 0%  +33.33%  (p=0.000 n=20+20)
    GCD100x1000/WithXY-8                  12.0 ± 0%      13.0 ± 0%   +8.33%  (p=0.000 n=20+20)
    GCD100x10000/WithoutXY-8              6.00 ± 0%      8.00 ± 0%  +33.33%  (p=0.000 n=20+20)
    GCD100x10000/WithXY-8                 12.0 ± 0%      13.0 ± 0%   +8.33%  (p=0.000 n=20+20)
    GCD100x100000/WithoutXY-8             6.00 ± 0%      8.00 ± 0%  +33.33%  (p=0.000 n=20+20)
    GCD100x100000/WithXY-8                12.0 ± 0%      13.0 ± 0%   +8.33%  (p=0.000 n=20+20)
    GCD1000x1000/WithoutXY-8              10.0 ± 0%      10.0 ± 0%     ~     (all equal)
    GCD1000x1000/WithXY-8                 19.0 ± 0%      20.0 ± 0%   +5.26%  (p=0.000 n=20+20)
    GCD1000x10000/WithoutXY-8             8.00 ± 0%      8.00 ± 0%     ~     (all equal)
    GCD1000x10000/WithXY-8                26.0 ± 0%      26.0 ± 0%     ~     (all equal)
    GCD1000x100000/WithoutXY-8            8.00 ± 0%      8.00 ± 0%     ~     (all equal)
    GCD1000x100000/WithXY-8               27.0 ± 0%      27.0 ± 0%     ~     (all equal)
    GCD10000x10000/WithoutXY-8            10.0 ± 0%      10.0 ± 0%     ~     (all equal)
    GCD10000x10000/WithXY-8               76.0 ± 0%      78.0 ± 0%   +2.63%  (p=0.000 n=20+20)
    GCD10000x100000/WithoutXY-8           8.00 ± 0%      8.00 ± 0%     ~     (all equal)
    GCD10000x100000/WithXY-8               174 ± 0%       174 ± 0%     ~     (all equal)
    GCD100000x100000/WithoutXY-8          10.0 ± 0%      10.0 ± 0%     ~     (all equal)
    GCD100000x100000/WithXY-8              645 ± 0%       647 ± 0%   +0.31%  (p=0.000 n=20+20)
    Hilbert-8                            14.1k ± 0%     14.3k ± 0%   +0.92%  (p=0.000 n=20+20)
    Binomial-8                            38.0 ± 0%      38.0 ± 0%     ~     (all equal)
    QuoRem-8                              0.00           0.00          ~     (all equal)
    Exp-8                                 21.0 ± 0%      21.0 ± 0%     ~     (all equal)
    Exp2-8                                22.0 ± 0%      22.0 ± 0%     ~     (all equal)
    Bitset-8                              0.00           0.00          ~     (all equal)
    BitsetNeg-8                           0.00           0.00          ~     (all equal)
    BitsetOrig-8                          1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    BitsetNegOrig-8                       2.00 ± 0%      2.00 ± 0%     ~     (all equal)
    ModSqrt225_Tonelli-8                  85.0 ± 0%      86.0 ± 0%   +1.18%  (p=0.000 n=20+20)
    ModSqrt225_3Mod4-8                    25.0 ± 0%      25.0 ± 0%     ~     (all equal)
    ModSqrt231_Tonelli-8                  80.0 ± 0%      80.0 ± 0%     ~     (all equal)
    ModSqrt231_5Mod8-8                    32.0 ± 0%      32.0 ± 0%     ~     (all equal)
    ModInverse-8                          11.0 ± 0%      11.0 ± 0%     ~     (all equal)
    Sqrt-8                                13.0 ± 0%      13.0 ± 0%     ~     (all equal)
    IntSqr/1-8                            0.00           0.00          ~     (all equal)
    IntSqr/2-8                            0.00           0.00          ~     (all equal)
    IntSqr/3-8                            0.00           0.00          ~     (all equal)
    IntSqr/5-8                            0.00           0.00          ~     (all equal)
    IntSqr/8-8                            0.00           0.00          ~     (all equal)
    IntSqr/10-8                           0.00           0.00          ~     (all equal)
    IntSqr/20-8                           1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    IntSqr/30-8                           1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    IntSqr/50-8                           1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    IntSqr/80-8                           1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    IntSqr/100-8                          1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    IntSqr/200-8                          1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    IntSqr/300-8                          3.00 ± 0%      3.00 ± 0%     ~     (all equal)
    IntSqr/500-8                          3.00 ± 0%      3.00 ± 0%     ~     (all equal)
    IntSqr/800-8                          9.00 ± 0%      9.00 ± 0%     ~     (all equal)
    IntSqr/1000-8                         9.00 ± 0%      9.00 ± 0%     ~     (all equal)
    Div/20/10-8                           0.00           0.00          ~     (all equal)
    Div/200/100-8                         0.00           0.00          ~     (all equal)
    Div/2000/1000-8                       0.00           0.00          ~     (all equal)
    Div/20000/10000-8                     0.00           0.00          ~     (all equal)
    Div/200000/100000-8                   0.00           0.00          ~     (all equal)
    Mul-8                                 2.00 ± 0%      2.00 ± 0%     ~     (all equal)
    ZeroShifts/Shl-8                      1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    ZeroShifts/ShlSame-8                  0.00           0.00          ~     (all equal)
    ZeroShifts/Shr-8                      1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    ZeroShifts/ShrSame-8                  0.00           0.00          ~     (all equal)
    Exp3Power/0x10-8                      4.00 ± 0%      4.00 ± 0%     ~     (all equal)
    Exp3Power/0x40-8                      4.00 ± 0%      4.00 ± 0%     ~     (all equal)
    Exp3Power/0x100-8                     5.00 ± 0%      5.00 ± 0%     ~     (all equal)
    Exp3Power/0x400-8                     7.00 ± 0%      7.00 ± 0%     ~     (all equal)
    Exp3Power/0x1000-8                    11.0 ± 0%      11.0 ± 0%     ~     (all equal)
    Exp3Power/0x4000-8                    15.0 ± 0%      15.0 ± 0%     ~     (all equal)
    Exp3Power/0x10000-8                   29.0 ± 0%      29.0 ± 0%     ~     (all equal)
    Exp3Power/0x40000-8                    140 ± 0%       140 ± 0%     ~     (all equal)
    Exp3Power/0x100000-8                 1.12k ± 0%     1.12k ± 0%     ~     (all equal)
    Exp3Power/0x400000-8                 9.88k ± 0%     9.88k ± 0%     ~     (p=0.747 n=17+19)
    Fibo-8                                 739 ± 0%       743 ± 0%   +0.54%  (p=0.000 n=20+20)
    NatSqr/1-8                            1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    NatSqr/2-8                            1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    NatSqr/3-8                            1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    NatSqr/5-8                            1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    NatSqr/8-8                            1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    NatSqr/10-8                           1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    NatSqr/20-8                           2.00 ± 0%      2.00 ± 0%     ~     (all equal)
    NatSqr/30-8                           2.00 ± 0%      2.00 ± 0%     ~     (all equal)
    NatSqr/50-8                           2.00 ± 0%      2.00 ± 0%     ~     (all equal)
    NatSqr/80-8                           2.00 ± 0%      2.00 ± 0%     ~     (all equal)
    NatSqr/100-8                          2.00 ± 0%      2.00 ± 0%     ~     (all equal)
    NatSqr/200-8                          2.00 ± 0%      2.00 ± 0%     ~     (all equal)
    NatSqr/300-8                          4.00 ± 0%      4.00 ± 0%     ~     (all equal)
    NatSqr/500-8                          4.00 ± 0%      4.00 ± 0%     ~     (all equal)
    NatSqr/800-8                          10.0 ± 0%      10.0 ± 0%     ~     (all equal)
    NatSqr/1000-8                         10.0 ± 0%      10.0 ± 0%     ~     (all equal)
    NatSetBytes/8-8                       0.00           0.00          ~     (all equal)
    NatSetBytes/24-8                      1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    NatSetBytes/128-8                     1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    NatSetBytes/7-8                       0.00           0.00          ~     (all equal)
    NatSetBytes/23-8                      1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    NatSetBytes/127-8                     1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    ScanPi-8                              60.0 ± 0%      61.0 ± 0%   +1.67%  (p=0.000 n=20+20)
    StringPiParallel-8                    24.0 ± 0%      24.0 ± 0%     ~     (all equal)
    Scan/10/Base2-8                       1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/100/Base2-8                      1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/1000/Base2-8                     1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/10000/Base2-8                    1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/100000/Base2-8                   1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/10/Base8-8                       1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/100/Base8-8                      1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/1000/Base8-8                     1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/10000/Base8-8                    1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/100000/Base8-8                   1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/10/Base10-8                      1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/100/Base10-8                     1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/1000/Base10-8                    1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/10000/Base10-8                   1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/100000/Base10-8                  1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/10/Base16-8                      1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/100/Base16-8                     1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/1000/Base16-8                    1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/10000/Base16-8                   1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    Scan/100000/Base16-8                  1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/10/Base2-8                     1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/100/Base2-8                    1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/1000/Base2-8                   1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/10000/Base2-8                  1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/100000/Base2-8                 1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/10/Base8-8                     1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/100/Base8-8                    1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/1000/Base8-8                   1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/10000/Base8-8                  1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/100000/Base8-8                 1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/10/Base10-8                    2.00 ± 0%      2.00 ± 0%     ~     (all equal)
    String/100/Base10-8                   2.00 ± 0%      2.00 ± 0%     ~     (all equal)
    String/1000/Base10-8                  3.00 ± 0%      3.00 ± 0%     ~     (all equal)
    String/10000/Base10-8                 3.00 ± 0%      3.00 ± 0%     ~     (all equal)
    String/100000/Base10-8                3.00 ± 0%      3.00 ± 0%     ~     (all equal)
    String/10/Base16-8                    1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/100/Base16-8                   1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/1000/Base16-8                  1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/10000/Base16-8                 1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    String/100000/Base16-8                1.00 ± 0%      1.00 ± 0%     ~     (all equal)
    LeafSize/0-8                          10.0 ± 0%      10.0 ± 0%     ~     (all equal)
    LeafSize/1-8                          13.0 ± 0%      13.0 ± 0%     ~     (all equal)
    LeafSize/2-8                          13.0 ± 0%      13.0 ± 0%     ~     (all equal)
    LeafSize/3-8                          13.0 ± 0%      13.0 ± 0%     ~     (all equal)
    LeafSize/4-8                          13.0 ± 0%      13.0 ± 0%     ~     (all equal)
    LeafSize/5-8                          13.0 ± 0%      13.0 ± 0%     ~     (all equal)
    LeafSize/6-8                          12.0 ± 0%      12.0 ± 0%     ~     (all equal)
    LeafSize/7-8                          12.0 ± 0%      12.0 ± 0%     ~     (all equal)
    LeafSize/8-8                          12.0 ± 0%      12.0 ± 0%     ~     (all equal)
    LeafSize/9-8                          12.0 ± 0%      12.0 ± 0%     ~     (all equal)
    LeafSize/10-8                         12.0 ± 0%      12.0 ± 0%     ~     (all equal)
    LeafSize/11-8                         12.0 ± 0%      12.0 ± 0%     ~     (all equal)
    LeafSize/12-8                         12.0 ± 0%      12.0 ± 0%     ~     (all equal)
    LeafSize/13-8                         12.0 ± 0%      12.0 ± 0%     ~     (all equal)
    LeafSize/14-8                         12.0 ± 0%      12.0 ± 0%     ~     (all equal)
    LeafSize/15-8                         12.0 ± 0%      12.0 ± 0%     ~     (all equal)
    LeafSize/16-8                         12.0 ± 0%      12.0 ± 0%     ~     (all equal)
    LeafSize/32-8                         12.0 ± 0%      12.0 ± 0%     ~     (all equal)
    LeafSize/64-8                         11.0 ± 0%      11.0 ± 0%     ~     (all equal)
    ProbablyPrime/n=0-8                   52.0 ± 0%      52.0 ± 0%     ~     (all equal)
    ProbablyPrime/n=1-8                   73.0 ± 0%      73.0 ± 0%     ~     (all equal)
    ProbablyPrime/n=5-8                    157 ± 0%       157 ± 0%     ~     (all equal)
    ProbablyPrime/n=10-8                   262 ± 0%       262 ± 0%     ~     (all equal)
    ProbablyPrime/n=20-8                   472 ± 0%       472 ± 0%     ~     (all equal)
    ProbablyPrime/Lucas-8                 22.0 ± 0%      22.0 ± 0%     ~     (all equal)
    ProbablyPrime/MillerRabinBase2-8      29.0 ± 0%      29.0 ± 0%     ~     (all equal)
    FloatSqrt/64-8                        9.00 ± 0%     10.00 ± 0%  +11.11%  (p=0.000 n=20+20)
    FloatSqrt/128-8                       12.0 ± 0%      13.0 ± 0%   +8.33%  (p=0.000 n=20+20)
    FloatSqrt/256-8                       8.00 ± 0%      8.00 ± 0%     ~     (all equal)
    FloatSqrt/1000-8                      9.00 ± 0%      9.00 ± 0%     ~     (all equal)
    FloatSqrt/10000-8                     14.0 ± 0%      14.0 ± 0%     ~     (all equal)
    FloatSqrt/100000-8                    33.0 ± 0%      33.0 ± 0%     ~     (all equal)
    FloatSqrt/1000000-8                  1.16k ± 0%     1.16k ± 0%     ~     (all equal)
    [Geo mean]                            6.62           6.76        +2.09%
    
    Change-Id: Id9df4157cac1e07721e35cff7fcdefe60703873a
    Reviewed-on: https://go-review.googlesource.com/c/150999
    Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
    Reviewed-by: 's avatarAlan Donovan <adonovan@google.com>
    Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
    bfc54bb6
nat.go 29 KB