LazySweepを更新というか全書き換え

RubyにLazySweepのパッチを作った - I am Cruby!
Heapの構造が変わったために前のパッチは適用できなくなったので、
以前作ったLazySweepをほとんど書き換えてしまいました。
中々シンプルに実装できたと思います。
 

patch

リビジョン16484に対するパッチです。
http://www.narihiro.info/resource/rb_gc_lazy_sweep_r_16484.diff
 

benchmark

この前のテストで使ったbenchmarkをためした所。
ほぼ変わらない性能になった(若干よくなったかも)

  NormalGC LazyGC difference
gc call 26 120277 462604%
gc all time 1883.99 1122.25 60%
gc ave time 72.46 0.01 0%
gc min time 0.09 0 0%
gc max time 231.9 195.77 84%
object ave cnt 13557178 8554871 63%
object max cnt 54019364 51934300 96%
object fin cnt 54019364 51934300 96%
program time 55.36 59.8 108%

 
スループットが改善されたように見えるんだけど、こりゃなんだ?
多分、計測のしかたが悪いんだろう。program time は遅くなっているし。
 

バグ

とれないバグがある。
普通にflagを使ってFL_MARKとかで1ビット立てた状態がどこかでクリアされて
LazySweep時に生きているObjectがfreeされるバグがあるんだけど、解決できなかった。
struct RVALUE に char color を持たせる事でしのいでるので、また追わないといけないなぁ。
 

thread local な slot

の改善も試したいな。
が、中々難しい。