読者です 読者をやめる 読者になる 読者になる

YARVではclass_evalのブロック呼び出しはStringの呼び出しよりも4.6倍速い

ruby

IRCでclass_evalのコストの話になって
mameさんがベンチマークをとってくれました。
実行したプログラムは

i = 0; while i < 100000; Object.class_eval { define_method(:foo) { } }; i += 1; end

i = 0; while i < 100000; Object.class_eval "define_method(:foo) { }"; i += 1; end

です。
結果は

1.8 1.9
ブロック呼出 2.26 0.76
String呼出 1.86 3.54

1.9の結果はきれいにでました。
1.8はなぜか速くなりました。
これは1.8のブロックの呼び出しのコストが高いためだろうとのこと。
1.8はおいといて、1.9はコンパイルするから悪くないようです。

結論

evalシリーズをブロック呼び出しで使うのは
そんなに遅くないよ。