インクリメンタルGC実装

Matzにっき(2006-04-17)
 
によるとやっぱりインクリメンタルGCにてレスポンス性能が上がればいいと思うわけで、
早速実装してみた。
 
計画
 ・Sweepフェイズを漸次的に行う
 ・TreadmillGCアルゴリズムを元に
 ・スループット性能は120%程度の増大で抑える
 ・レスポンス性能は50%程度の改善
 ・世代別GCは入れない
 ・ライトバリアも使わない
 
んで、3日くらいでできた。
 
パッチファイル
inclemental_gc.diff
 
性能の差だけども

//オリジナル
all GC time = 4.653788
all GC cnt = 1742
min GC time = 0.002224
max GC time = 0.010387
add_heap cnt = 2
ave GC time = 0.00267152009184845

//インクリメンタルGC
all GC time = 6.07601699999998
all GC cnt = 3476
min GC time = 0.001342
max GC time = 0.015997
add_heap cnt = 2
ave GC time = 0.0017479910817031

//比較
全体のGC時間    : 131.61%
平均GC時間     : 65.96%
GC処理呼び出し回数 : 199.54%

と中々いい感じなのでruby-devにメール流そうかと思ったんだけども、
make testでSEGVが出てしまう。
デバッグしてもしてもさっぱり分からないので誰か助けてくださいという状況。。。(半泣きで)
Sweepを漸次的に行ってるのでmallocとfreeのバランスがだめなのかもとか、
ライトバリアしてないと駄目なのかとか(頭の中では多分大丈夫なはずなんだけどなぁ)
いろいろ考えて2週間くらいバグが取れない。。。
 
う〜ん、どうしたものか。