あきらめずに高速化

悔しくて、ついかっとなって別の方法を考えてみた。

次のまな板に挙げるのはIS_FREE_CELL

#define IS_FREE_CELL(obj) (obj->as.basic.flags == 0 || obj->as.basic.flags == FL_BMAP_UNDER)

#define IS_FREE_CELL(obj) ((obj->as.basic.flags & ~(FL_BMAP_UNDER)) == 0)

にしてみた。

結果

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         0.00000000000000000000
    4               0.078              1081080              1098800                54940         0.00000000000000000000
    5               0.110              1932780              1951600                97580         1.49999999999999933387
    6               0.203              3472560              3493200               174660         1.59999999999999897859
    7               0.344              6240780              6264800               313240         3.09999999999999964473
    8               0.594             11220300             11250400               562520         6.19999999999999840128
    9               1.016             19065440             19106000               955300         9.40000000000000923706
   10               1.360             24459700             24518000              1225900        10.89999999999999680256
   11               2.047             36614560             36686800              1834340        15.60000000000001740830


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.00000000000000081044
    6           2216560           8000000       213          false    1.59999999999999897859    0.00000000000000036185
    7           2547868           8000000       382          false    3.09999999999999964473    0.00000000000000245301
    8           7393976           8000000       686          false    4.69999999999999840128    1.50000000000000532907
    9           7999996           8000000      1165          false    7.80000000000000870415    1.60000000000000075495
   10           9450624           8000000      1495          false    9.29999999999999893419    1.60000000000000075495
   11          15801324           9448143      2237          false   14.10000000000001563194    1.50000000000001443290

ごくり!、Mark Timeが、17ms -> 14msこれは効果ありそうです。追試よろしくお願いします。