YARVではclass_evalのブロック呼び出しはStringの呼び出しよりも4.6倍速い
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シリーズをブロック呼び出しで使うのは
そんなに遅くないよ。