2009-02-12
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本家でも、とても面倒ですが適応できるんじゃないかなと思います。
- インラインメソッドキャッシュや、インライン定数キャッシュみたいなインラインインスタンス変数キャッシュを用意する
- st_lookupの呼び出しをキャッシュする(インスタンス変数のアドレスではなくivptrのインデックスというのがミソ)
- キャッシュ無効フラグを作って、新しくインスタンス変数が誕生したときや、メソッドを再定義したときなんかは立てる
実は、もうやっていて効果が無いとかの理由で却下になった案という可能性はとても高そうですが・・・。
コメントを書く
ささだ
2009/02/12 19:19
やろうやろうと思ってて,まだやってません.ivar アクセスってそんなにないんじゃないの? って思ってて.ちょっと考えてみようかなあ.
miura1729
2009/02/12 21:06
ぜひお願いします。ivarアクセスは結構あると思いますし、スタックアクセスが速いのでivarアクセスがクローズアップされてきます。複雑な問題でRuby1.8に追いつかれる傾向がかなり改善されるんじゃないかなと思います。
トラックバック - http://d.hatena.ne.jp/miura1729/20090212/1234426522
リンク元
- 27 http://www.rubyist.net/~kazu/samidare/
- 16 http://lucille.atso-net.jp/aobench/
- 2 http://a.hatena.ne.jp/cranebird/mobile
- 2 http://a.hatena.ne.jp/fujita-y/
- 2 http://d.hatena.ne.jp/kwatch/20080304/1204646782
- 2 http://reader.livedoor.com/reader/
- 2 http://www.google.co.jp/hws/search?hl=ja&q=aoベンチ&client=fenrir&channel=&adsafe=off&safe=off&lr=lang_ja
- 2 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja-JP:official&hs=l3l&q=ypsilon+scheme&revid=302840165&ei=-fKVSb_mAZTq6QPu3aX0CA&sa=X&oi=revisions_inline&resnum=0&ct=top-revision&cd=2
- 2 http://www.google.co.jp/search?hl=ja&q=RFC1213&meta=lr=&aq=f
- 2 http://www.google.co.jp/search?q=ランダムテスト&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a