AOベンチ高速化計画 (その2.7)

その2.5の考え方を実装してみました。その結果、速度が約30%向上しました。

time ruby19 yarv2llvm.rb --no-type-message sample/ao-render.rb > ao.ppm

real	2m20.572s
user	2m19.763s
sys	0m0.624s

最初のバージョンはrealが3分20秒くらいでした。これだと、Ruby1.9に比べて4倍くらい、
コンパイル時間を入れないと5倍くらいという感じかなと思います。
プログラムの変更点は以下の通りです。

http://github.com/miura1729/yarv2llvm/commit/73f68d4b973209ad5bf2c4f6013cc4ad52283c0f

継承は全然考慮していないのですが、なんか動いているみたいです。エラーが出たらそのとき考えます。

この高速化はRuby1.9本家でも、とても面倒ですが適応できるんじゃないかなと思います。

  1. インラインメソッドキャッシュや、インライン定数キャッシュみたいなインラインインスタンス変数キャッシュを用意する
  2. st_lookupの呼び出しをキャッシュする(インスタンス変数のアドレスではなくivptrのインデックスというのがミソ)
  3. キャッシュ無効フラグを作って、新しくインスタンス変数が誕生したときや、メソッドを再定義したときなんかは立てる

実は、もうやっていて効果が無いとかの理由で却下になった案という可能性はとても高そうですが・・・。