暇人じゃない

.map { |x| x.hoge } と .map(:hoge) のパフォーマンス

.map(:hoge) は短く書けて良いですよね。
.map { |x| x.hoge }.map(:hoge) のパフォーマンスが気になったので少し調べてみました。

コード:

require 'benchmark'

arr = Hoge.all # count: 200

Benchmark.bm do |x|
  x.report do
    10000.times { arr.map { |a| a.id } }
  end
  x.report do
    10000.times { arr.map(&:id) }
  end
end

結果:

    user     system      total        real
1.290000   0.000000   1.290000 (  1.296815)
1.300000   0.000000   1.300000 (  1.491210)

前者の方が若干速い、という結果になりました。

ただ、全部がそのような結果になるかというとそうでもなくて、例えば to_s する処理だと後者の処理が若干速いみたいです。

コード:

require 'benchmark'

arr = Array.new(100) { |i| i }

Benchmark.bm do |x|
  x.report do
    10000.times { arr.map { |x| x.to_s } }
  end
  x.report do
    10000.times { arr.map(&:to_s) }
  end
end

結果:

    user     system      total        real
0.310000   0.000000   0.310000 (  0.329866)
0.240000   0.000000   0.240000 (  0.241115)

使い分けが難しいですね…