トップ «前の日記(2004-01-12) 最新 次の日記(2004-01-19)» 月表示 編集

日々の流転


2004-01-14 [長年日記]

λ. YARV + Ruby/TCC

YARVの出力したバイトコードを、実行時にC言語に落としてRuby/TCCでコンパイルしてみる(そのためのパッチ)。でも、そしたらかえって遅くなってしまった (T_T)

青木さんの「これを使ってJITコンパイラ作れるかな」というツッコミを見てから、実行時にrb_eval()を部分計算してRuby/TCCでコンパイルというのをずっと考えてたのだけど、rb_eval()がでか過ぎてこれは挫折してたのでした。YARVはまだ小さいので簡単に試せて楽しかった。

Tags: ruby
本日のツッコミ(全9件) [ツッコミを入れる]
ψ ささだ (2004-01-16 00:24)

んーと、そのために命令と独立にしてるんで、結構いけそうな気がしなくも無いが。(しかし、いきなり大技だ)

ψ さかい (2004-01-17 01:36)

tccではなくgccを使ったら、ちゃんと速くなりました (^^;<br>どうやら、遅くなってしまっていた原因は、コンパイラの違いにあったようです。<br><br>……というわけで、デフォルトではRubyをコンパイルしたコンパイラを使うようにしてみました。<br>http://www.tom.sfc.keio.ac.jp/~sakai/d/data/200401/yarv000c-jit.diff

ψ ささだ (2004-01-17 05:44)

- 速くなったのはどれくらい?<br>- スタック操作、どうやってんのかよくわかんないんだけど<br>- 変換後のソースぷりーずー

ψ さかい (2004-01-17 21:46)

> - 速くなったのはどれくらい?<br><br>実行時間(コンパイル時間を除く)を見ると、大体20%くらい速くなってます。<br><br>fib(32)<br>------------------<br>ruby 14.020000<br>yarv 8.782000<br>yarv+gcc 7.240000<br><br>tak(24,16,8)<br>------------------<br>ruby 4.586000<br>yarv 2.594000<br>yarv+gcc 2.063000<br><br>> - スタック操作、どうやってんのかよくわかんないんだけど<br><br>sendのとこですか?<br><br>元々のコードだと goto first; しているため、footerの PUSH(val) は実行されていなかったのですが、私のコードだと goto first; しなくなっているので、PUSH(val) が実行されてしまい、そのままだとスタックがずれてしまします。<br><br>そこで、PUSH(val)を相殺するためにあらかじめ<br>val = TOPN(0);<br>POPN(1);<br>してます。<br><br>> - 変換後のソースぷりーずー<br><br>後でアップロードしときます。

ψ ささだ (2004-01-17 23:09)

ああ、なんてこった。PUSH は insns2vm.rb で加えちゃってんのか(もう覚えていない)。だめだこりゃ。<br><br>要するに、命令ディスパッチのコストはがんばっても2割ほどしか速くなんねーってことですね。<br><br>それはそれで、非常に有意義な結果ですね。感謝。<br><br>スタック操作を消せば、倍にはなりそうだな。

ψ さかい (2004-01-18 20:56)

> スタック操作を消せば、倍にはなりそうだな。<br><br>そうですね。私も本当はそこまでやりたかったのですが、学期末で時間がないのでした (T_T)<br><br>それと、あれからちょっと変更したので、パッチを新しくしました。<br>http://www.tom.sfc.keio.ac.jp/~sakai/d/data/200401/yarv000c-jit2.diff <br><br>あと変換後のソースの例です。<br>http://www.tom.sfc.keio.ac.jp/~sakai/d/data/200401/yarv000c-jit2-fib.c<br>以下のプログラムを実行したときに内部で生成されているものです。<br><br>----<br>require 'yarvcore'<br>require 'yarvjit'<br><br>prog =<<EOS<br>def fib(n)<br> if n < 2 then<br> 1<br> else<br> fib(n-2) + fib(n-1)<br> end<br>end<br>fib(32)<br>EOS<br><br>bs = YARVCore.parse(prog)<br>YARVJIT.compile_all<br><br>vm = YARVCore::VM.new<br>vm.eval(bs)

ψ ささだ (2004-01-26 07:22)

100倍になりますた.

ψ さかい (2004-01-26 10:22)

さっすがぁ!<br><br>P.S.<br>今度のRHG読書会の時にでもYARVの事を色々と訊こうと思ってたのですが、私はちょっと都合が悪くなってしまい今回は参加できそうにないのでした。残念無念なり〜 (T_T)

ψ ささだ (2004-01-26 13:26)

なんてこった.私も色々と聞こうと思ってたのに.sfc まで行こうかなぁ(何しに).