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倍だってなるけど、意味ないよね。
多くのユーザはメソッド化していると信じてる(願ってる?)から、あんまり速くなりませんな。