Bitmap GCの高速化案を試してみた

autorNariさんにパッチを更新してもらったおかげで、試すことが出来ました。結果です。

miniruby-myが高速化案を入れたものです。

miniruby.exe -e "GC::Profiler.enable; a = []; 2000000.times {a << [1, 2]}; GC::Profiler.report"
GC 11 invokes.
Index    Invoke Time(sec)       Use Size(byte)     Total Size(byte)         Total Object                    GC Time(ms)
    1               0.031               193420               213200                10660         0.00000000000000000000
    2               0.047               343980               360800                18040         0.00000000000000000000
    3               0.062               606060               623200                31160         0.00000000000000000000
    4               0.094              1081080              1098800                54940         0.00000000000000000000
    5               0.140              1932780              1951600                97580         1.60000000000000075495
    6               0.250              3472560              3493200               174660         1.50000000000000155431
    7               0.422              6240780              6264800               313240         3.10000000000000186517
    8               0.734             11220300             11250400               562520         6.29999999999999449329
    9               1.234             19065440             19106000               955300        11.00000000000000888178
   10               1.640             24459700             24518000              1225900        14.09999999999999253930
   11               2.453             36614560             36686800              1834340        21.89999999999999857891


More detail.
Index Allocate Increase    Allocate Limit  Use Slot  Have Finalize             Mark Time(ms)            Sweep Time(ms)
    1            809267           8000000        13           true    0.00000000000000000000    0.00000000000000000000
    2            195552           8000000        22          false    0.00000000000000000000    0.00000000000000000000
    3            315620           8000000        38          false    0.00000000000000000000    0.00000000000000000000
    4            379716           8000000        67          false    0.00000000000000000000    0.00000000000000000000
    5           1052104           8000000       119          false    1.60000000000000075495    0.00000000000000000000
    6           2216560           8000000       213          false    1.50000000000000155431    0.00000000000000012468
    7           2547868           8000000       382          false    3.10000000000000186517    0.00000000000000000000
    8           7393976           8000000       686          false    6.29999999999999449329    0.00000000000000042826
    9           7999996           8000000      1165          false    9.40000000000000923706    1.59999999999999964473
   10           9450624           8000000      1495          false   12.49999999999999111822    1.59999999999999231726
   11          15801324           9448143      2237          false   18.69999999999999573674    3.20000000000001483258

高速化案

miniruby-my.exe -e "GC::Profiler.enable; a = []; 2000000.times {a << [1, 2]}; GC::Profiler.report"
GC 11 invokes.
Index    Invoke Time(sec)       Use Size(byte)     Total Size(byte)         Total Object                    GC Time(ms)
    1               0.047               193420               213200                10660         0.00000000000000000000
    2               0.063               343980               360800                18040         0.00000000000000000000
    3               0.078               606060               623200                31160         0.00000000000000000000
    4               0.110              1081080              1098800                54940         0.00000000000000000000
    5               0.156              1932780              1951600                97580         1.60000000000000075495
    6               0.266              3472560              3493200               174660         1.50000000000000155431
    7               0.438              6240780              6264800               313240         3.10000000000000186517
    8               0.750             11220300             11250400               562520         6.29999999999999449329
    9               1.235             19065440             19106000               955300        10.89999999999999857891
   10               1.656             24459700             24518000              1225900        14.09999999999999253930
   11               2.453             36614560             36686800              1834340        20.29999999999999715783


More detail.
Index Allocate Increase    Allocate Limit  Use Slot  Have Finalize             Mark Time(ms)            Sweep Time(ms)
    1            809267           8000000        13           true    0.00000000000000000000    0.00000000000000000000
    2            195552           8000000        22          false    0.00000000000000000000    0.00000000000000000000
    3            315620           8000000        38          false    0.00000000000000000000    0.00000000000000000000
    4            379716           8000000        67          false    0.00000000000000000000    0.00000000000000000000
    5           1052104           8000000       119          false    1.60000000000000075495    0.00000000000000000000
    6           2216560           8000000       213          false    1.50000000000000155431    0.00000000000000012468
    7           2547868           8000000       382          false    3.10000000000000186517    0.00000000000000000000
    8           7393976           8000000       686          false    4.69999999999999484857    1.60000000000000186517
    9           7999996           8000000      1165          false    9.29999999999999893419    1.60000000000000097700
   10           9450624           8000000      1495          false   10.99999999999999111822    3.10000000000000497380
   11          15801324           9448143      2237          false   17.19999999999999928946    3.09999999999998454570

おお!、速くなってる。順番を代えてもう一度実行

高速化案

miniruby-my.exe -e "GC::Profiler.enable; a = []; 2000000.times {a << [1, 2]}; GC::Profiler.report"
GC 11 invokes.
Index    Invoke Time(sec)       Use Size(byte)     Total Size(byte)         Total Object                    GC Time(ms)
    1               0.031               193420               213200                10660         0.00000000000000000000
    2               0.047               343980               360800                18040         0.00000000000000000000
    3               0.063               606060               623200                31160         0.00000000000000000000
    4               0.094              1081080              1098800                54940         0.00000000000000000000
    5               0.141              1932780              1951600                97580         1.49999999999999933387
    6               0.250              3472560              3493200               174660         1.59999999999999720224
    7               0.406              6240780              6264800               313240         3.19999999999999928946
    8               0.688             11220300             11250400               562520         6.20000000000000106581
    9               1.188             19065440             19106000               955300        10.89999999999999147349
   10               1.610             24459700             24518000              1225900        13.99999999999999644729
   11               2.438             36614560             36686800              1834340        20.30000000000001136868


More detail.
Index Allocate Increase    Allocate Limit  Use Slot  Have Finalize             Mark Time(ms)            Sweep Time(ms)
    1            809267           8000000        13           true    0.00000000000000000000    0.00000000000000000000
    2            195552           8000000        22          false    0.00000000000000000000    0.00000000000000000000
    3            315620           8000000        38          false    0.00000000000000000000    0.00000000000000000000
    4            379716           8000000        67          false    0.00000000000000000000    0.00000000000000000000
    5           1052104           8000000       119          false    1.49999999999999933387    0.00000000000000069118
    6           2216560           8000000       213          false    1.59999999999999720224    0.00000000000000152601
    7           2547868           8000000       382          false    3.19999999999999928946    0.00000000000000212504
    8           7393976           8000000       686          false    4.70000000000000106581    1.49999999999999644729
    9           7999996           8000000      1165          false    9.29999999999999182876    1.59999999999999453770
   10           9450624           8000000      1495          false   10.89999999999999680256    3.09999999999999786837
   11          15801324           9448143      2237          false   17.20000000000001350031    3.09999999999999698019

miniruby.exe -e "GC::Profiler.enable; a = []; 2000000.times {a << [1, 2]}; GC::Profiler.report"
GC 11 invokes.
Index    Invoke Time(sec)       Use Size(byte)     Total Size(byte)         Total Object                    GC Time(ms)
    1               0.031               193420               213200                10660         0.00000000000000000000
    2               0.031               343980               360800                18040         0.00000000000000000000
    3               0.047               606060               623200                31160         1.59999999999999964473
    4               0.078              1081080              1098800                54940         1.59999999999999964473
    5               0.141              1932780              1951600                97580         1.49999999999999933387
    6               0.235              3472560              3493200               174660         1.49999999999999866773
    7               0.406              6240780              6264800               313240         4.69999999999999928946
    8               0.719             11220300             11250400               562520         6.19999999999999751310
    9               1.203             19065440             19106000               955300        11.00000000000000177636
   10               1.625             24459700             24518000              1225900        14.10000000000000675016
   11               2.438             36614560             36686800              1834340        20.30000000000001136868


More detail.
Index Allocate Increase    Allocate Limit  Use Slot  Have Finalize             Mark Time(ms)            Sweep Time(ms)
    1            809267           8000000        13           true    0.00000000000000000000    0.00000000000000000000
    2            195552           8000000        22          false    0.00000000000000000000    0.00000000000000000000
    3            315620           8000000        38          false    1.59999999999999964473    0.00000000000000000000
    4            379716           8000000        67          false    1.59999999999999964473    0.00000000000000000000
    5           1052104           8000000       119          false    0.00000000000000000000    1.49999999999999933387
    6           2216560           8000000       213          false    1.49999999999999866773    0.00000000000000000000
    7           2547868           8000000       382          false    3.19999999999999928946    1.50000000000000199840
    8           7393976           8000000       686          false    4.69999999999999751310    1.50000000000000488498
    9           7999996           8000000      1165          false    9.40000000000000213163    1.59999999999999298339
   10           9450624           8000000      1495          false   12.50000000000000532907    1.60000000000000630607
   11          15801324           9448143      2237          false   17.20000000000001350031    3.09999999999999698019

ということで、測定誤差でした。効果なしという結果です。