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