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秒ほど掛かります。