Hatena::ブログ(Diary)

miura1729の日記 このページをアンテナに追加 RSSフィード

2008-10-12

yarv2llvmが動き出した

13:25 |  yarv2llvmが動き出したを含むブックマーク  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秒ほど掛かります。

ささだささだ 2008/10/12 14:44 おお,すばらしい.

miura1729miura1729 2008/10/12 18:19 ありがとうございます
でも、まだチャンピオンデータで動くだけです。単項マイナスすらサポートして無いし。もうちょっと先に進めると思います。でも、C言語相当の機能が限界かなーって思います。

AdrianAdrian 2008/11/28 18:34 Unfortunately, I don't understand Japanese, but the benchmarks speak for themselves. Keep it up!

miura1729miura1729 2008/11/29 07:10 Thank you for your comment.
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.