A Ruby-to-Java Translator with Soft Typing
YARVは速くならないだろうと勝手に思い込んでいたんだが(今度誰かに聞いてみよう)、永田さんたちのA Scheme-to-Java Translator with Soft Typingを読んで、ふとjrubyは速くなったりしないんだろうかと思った。
そういうわけでjrubycを試してみる。インストールに苦労したんだけど、とりあえずわかったこと。
jrubycでコンパイルした.classでは、文字列でメソッドを指定して呼んでる。以下はDJ Java Decompilerで逆コンパイルした結果(一部)。
irubyobject;
JVM INSTR swap ;
threadcontext;
"fib";
irubyobject;
CallType.FUNCTIONAL;
Block.NULL_BLOCK;
CompilerHelpers.doInvokeDynamic();
文字列からメソッドを呼んでたら遅くなるような気がするんですけど、どうなんでしょう(いまどきのJVMなら十分速かったりするかも)。それに内部でメソッドキャッシュとかできるはずだしなぁ。うーむ。
ちょっとだけソース読んでみた。RubyのメソッドはDynamicMethodになってMapに格納されてるのかぁ。DynamicMethodとJavaのメソッドの対応付けは一回ですむから、そこは速くならないよなぁ。とすると、Mapを引くコスト対配列のアクセス一発ですむコスト、の勝負になる。それに型付けできない場合も考えると(というか、型付けできる場合の方が少ないだろうけど)、むむむ、どうなんでしょう。あとは、多少ダウンキャストが減らせるくらい?