2008-10-12
yarv2llvmが動き出した
yarv2llvmの生成したコードが動くようになりました。
使い方は、
require 'vmtraverse'
としておいて、こんな感じでメソッドを定義します。
YARV2LLVM::compile( <<EOS メソッドの定義 EOS )
定義したメソッドはRubyで定義したメソッドと同じように使えます。
ベンチマークをやってみました。
llvmfibの+ 0はまだ型推論がうまく行かないためfixnumだよということを明示するためです。無くても型推論できるはずですが、難儀しています。
require 'benchmark' def fib(n) if n < 2 then 1 else fib(n - 1) + fib(n - 2) end end YARV2LLVM::compile( <<EOS def llvmfib(n) if n < 2 then 1 else llvmfib(n - 1) + llvmfib(n - 2) + 0 end end EOS ) Benchmark.bm do |x| x.report("Ruby "){ p fib(35)} x.report("llvm "){ p llvmfib(35)} end
結果はこんな感じです。
user system total real
Ruby 14930352
5.390000 0.000000 5.390000 ( 5.388000)
llvm 14930352
0.235000 0.000000 0.235000 ( 0.223000)
まあ、なんというか・・・、こんだけ速くなると作った甲斐があったというものです。
追記
オプティマイズを掛けるようにするともっと速くなりました。
user system total real
Ruby 14930352
5.344000 0.000000 5.344000 ( 5.353000)
llvm 14930352
0.125000 0.000000 0.125000 ( 0.136000)
でも、コンパイル時間が2秒ほど掛かります。
トラックバック - http://d.hatena.ne.jp/miura1729/20081012/1223785541
リンク元
- 28 http://www.rubyist.net/~kazu/samidare/
- 2 http://a.hatena.ne.jp/fujita-y/
- 2 http://blog.search.goo.ne.jp/search_goo/result/?MT=llvm&from=web&da=all&dc=10&st=time&tg=all&ts=all&fs=all&rm=1&pg=2
- 2 http://d.hatena.ne.jp/
- 2 http://d.hatena.ne.jp/keita_yamaguchi/
- 2 http://reader.livedoor.com/reader/
- 1 http://a.hatena.ne.jp/h_sakurai/
- 1 http://blog-search.yahoo.co.jp/search?fr=top_ga1&ei=UTF-8&p=llvm
- 1 http://d.hatena.ne.jp/keita_yamaguchi/20080914/1221328049
- 1 http://d.hatena.ne.jp/keyword/ワーキングセット
でも、まだチャンピオンデータで動くだけです。単項マイナスすらサポートして無いし。もうちょっと先に進めると思います。でも、C言語相当の機能が限界かなーって思います。
Current version of yarv2llvm become little slower than this article. Because support 'self' variable. I have some idea for speed up, but I think I can't make speed of yarv2llvm with current feature over this article.