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])

こうシンボルに変更しただけで、もっと早くなりました。
シンボルはエコだなぁ。