evalやっぱり遅い
cgi.rb は大分昔に作られたライブラリなので、
実装が古い部分がたくさんあり、
evalが結構多用されています。
不要なevalが多いなと思ってちょっと計測したら、
やっぱりかなり差がありました。
これはインスタンスにインスタンス変数を定義して、
[1, 2, 3]という配列を入れるだけのコードなのですが、
evalとinstance_variable_setでかなり差があります。
require 'benchmark' i = 5000000 Benchmark.bm do |bm| bm.report do i.times do @a="" @a.instance_variable_set("@b", [1,2,3]) end end bm.report do i.times do @a="" @a.instance_eval do @b=[1,2,3] end end end end
結果は
user system total real 6.690000 0.100000 6.790000 ( 6.799377) 11.330000 0.530000 11.860000 ( 11.870176)
こんなんでした。後者が大分遅いのがわかります。
追記
@a.instance_variable_set(:@b, [1,2,3])
こうシンボルに変更しただけで、もっと早くなりました。
シンボルはエコだなぁ。