式展開とString#+とString#concat

昨日の添削で、+で文字列連結より式展開のほうがいいよと云われたのはたんにソースコードが見にくくなるからなのかなぁ、でも速度的にどうなんだろう、と思ってベンチマーク取ってみたら全然式展開のほうが速かった!(常識?)

#!/usr/bin/env ruby
require 'benchmark'

str = 'bar'
long_str =  str * 10000
n = 10000

Benchmark.bm do |bench|
  bench.report{ n.times{ "foo#{str}baz" } }
  bench.report{ n.times{ "foo" + str + "baz" } }
  bench.report{ n.times{ "foo".concat(str).concat("baz") } }
  bench.report{ n.times{ "foo#{long_str}baz" } }
  bench.report{ n.times{ "foo" + long_str + "baz" } }
  bench.report{ n.times{ "foo".concat(long_str).concat("baz") } }
end

で、結果が

      user     system      total        real
  0.020000   0.000000   0.020000 (  0.029779)
  0.040000   0.010000   0.050000 (  0.048267)
  0.040000   0.000000   0.040000 (  0.047543)
  0.320000   0.650000   0.970000 (  0.971954)
  0.970000   0.030000   1.000000 (  0.987794)
  0.510000   0.000000   0.510000 (  0.514898)

埋め込む文字列が短い場合は1.5倍速いけど、巨大なStringの場合はあんまかわらなくて、concatによる連結のほうが速いと。普通の場合は式展開つかったほうがたいてい見やすくて速くていいねー。