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
ということで、測定誤差でした。効果なしという結果です。