式展開と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による連結のほうが速いと。普通の場合は式展開つかったほうがたいてい見やすくて速くていいねー。