2008-12-15
trace_funcを実装しました
|yarv2llvmをスピードアップするにはprofilerがいるなーと思い、set_trace_func相当のものを作りました。set_trace_funcのそのままだとtrace_funcが設定されているかどうかを静的にチェックするのが面倒そうなので、YARV2LLVM#trace_funcというメソッドがあれば、それをYARVのtrace命令のタイミングで呼ぶようにしました。
YARV2LLVM::compile(<<-EOS, {}) module YARV2LLVM def trace_func(event, line) p line end end def fib(n) if n < 2 then 1 else fib(n - 1) + fib(n - 2) end end EOS
こんな感じでコンパイルしておいて、fib(3)とすると、
9 10 13 9 10 13 9 10 11 9 9 10 11 9 9 9 10 11 9 9
こんな感じで実行したメソッドの行番号が表示されます。trace_funcはllvmのオプティマイザーでインライン化されますのでオーバヘッドがかなり小さくなりそうです。今のところ、この機能はprofileというブランチを切ってそこに入っています。
トラックバック - http://d.hatena.ne.jp/miura1729/20081215/1229336295
リンク元
- 21 http://www.rubyist.net/~kazu/samidare/
- 3 http://a.hatena.ne.jp/fujita-y/
- 3 http://shinh.skr.jp/m/
- 2 http://d.hatena.ne.jp/keywordmobile/LLVM
- 1 http://72.14.235.132/search?q=cache:jnPsno8kiQIJ:d.hatena.ne.jp/miura1729/20080116/1200489891+javascript+PrintNode&hl=ja&ct=clnk&cd=15&gl=jp&lr=lang_ja&client=firefox
- 1 http://a.hatena.ne.jp/asip/
- 1 http://d.hatena.ne.jp/keita_yamaguchi/20080914/1221328049
- 1 http://k.hatena.ne.jp/keywordblog/文字列?date=20081122
- 1 http://madscientist.jp/~ikegami/diary/
- 1 http://rd.yahoo.co.jp/rss/l/blogsearch/search/S=2078379537/P=RSS/Q=オブジェクト/O=ALL/SIG=11ohu539j/*-http://d.hatena.ne.jp/miura1729/20081208/1228708318
でも本当にすばらしいのはllvmの最適化ですね。
trace_funcをインライン化するって発想は無かったです。でも、そうすると定数畳み込みと合せて、処理の必要の無いイベントはオーバヘッド無しになります。
llvmの強力な最適化があれば、もう少し過激にリフィレクティブな機能が入れられるかなって考えています。
イベントの番号はtrace命令の引数から取っているので、定数になるわけです。そう考えると、たとえばtrace_funcが
if (event == CALL)
:
elsif (event == RETURN)
:
end
とかという内容だった場合、trace_funcがインライン化されると、eventが定数なのでif文の条件が静的に決まります。だから、この条件にない例えばLINEとかのイベントはdead code削除で最終的には何もなかったことになるんじゃないかなと思います。