あきらめずに高速化
悔しくて、ついかっとなって別の方法を考えてみた。
次のまな板に挙げるのは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これは効果ありそうです。追試よろしくお願いします。