「RubyのHash#mapがarrayを返すのが気に食わないとき、ありますよね」について

このエントリのコメント欄を見て。

たぶん普通はyieldなんだろうけど、最近b[
みたいな書き方をすることが多くってこうしてるだけなのです。

http://ujihisa.nowa.jp/entry/e2629919e3#comment

Proc#[]はProc#callだったよなぁ、と思い出す。
でもって、Proc#callよりはyieldの方が早いんじゃなかったっけ、ということをうろ覚えに思い出す。
なので計ってみた。

require 'benchmark'

def hoge(&b)
  yield
end

def piyo(&b)
  b[]
end

n_repeat = 100000
block = lambda{ 1 + 2 }

puts Benchmark::CAPTION
puts Benchmark.measure{
  n_repeat.times do
    hoge(&block)
  end
}
puts Benchmark::CAPTION
puts Benchmark.measure{
  n_repeat.times do
    piyo(&block)
  end
}
      user     system      total        real
  0.235000   0.000000   0.235000 (  0.234000)
      user     system      total        real
  0.359000   0.000000   0.359000 (  0.359000)

お、yieldの方が早い。
だいたいこんな時間差なのかね。それともブロックの中身とか呼び出すコンテキストのスタックの深さとかでもっと差が付くのかな。