@m_seki の

I like ruby tooから引っ越し

benchmark.rb

require 'benchmark'
require 'erb'
require 'yaml'

script = File.read('erubybench.rhtml')
context = YAML.load_file('erubybench.yaml')
list = context['list']

count = 1000
Benchmark.bm(20) do |x|
  x.report('ERB.new') {
    count.times {
      ERB.new(script)
    }
  }

  erb = ERB.new(script)
  x.report('erb.result') {
    count.times {
      erb.result
    }
  }

  erb.def_method(Kernel, 'erb_bench(list)')
  x.report('def_method') {
    count.times {
      erb_bench(list)
    }
  }
end

user, system, total, realのうち、どれを比べればいいの? totalかなあ。
しかしiBookおそすぎ‥。

実行時間がERB.newで45%、erb.resultで65%になります。def_methodした場合でも70%。速度がn倍ってどうするんだろ。逆数にするだけでいいなら、ERB.newで2.2倍、erb.resultで1.5倍、def_methodで1.4倍?

なお、テストデータを加工すればもっと速く(遅く)なります。

ずるをして「旧版を使ったERB.new.result」と「新版を使ったdef_method」を比べちゃうという暴挙に出ると5.7倍だってなるけど、意味ないよね。

多くのユーザはメソッド化していると信じてる(願ってる?)から、あんまり速くなりませんな。