[ ruby 1.9.2p180 より ]
最近、Rubyで大量にString型を扱うプログラムを書く必要があったんけど、
初心者丸出しで以下のようなコードを書いたら、実行がクソ遅かった。
str = ""
10000.times do
str += "ruby"
end
こんな遅さありかよ・・・
と思って、リファレンスを見たら
self + other
文字列を連結した新しい文字列を返します。
とかクールに書いてあるじゃないか!?
オブジェクト作ってんのかよ!
ということは連結があるはず。
ありました。
self << other
文字列 other の内容を self に連結します(self の内容が変更されます)。
以下、速度比較。
10万回を5回行っていますので。
# +での生成
require 'benchmark'
puts Benchmark::CAPTION
5.times do
puts Benchmark.measure {
str = ""
100000.times do
str += "ruby "
end
}
end
# 結果
user system total real
6.420000 3.450000 9.870000 ( 9.840286)
6.360000 3.340000 9.700000 ( 9.665862)
6.360000 3.440000 9.800000 ( 9.779375)
6.390000 3.600000 9.990000 ( 9.958759)
6.440000 3.510000 9.950000 ( 9.921824)
さてお次は
# <<での連結
require 'benchmark'
puts Benchmark::CAPTION
5.times do
puts Benchmark.measure {
str = ""
100000.times do
str << "ruby "
end
}
end
# 結果
user system total real
0.030000 0.000000 0.030000 ( 0.024828)
0.020000 0.000000 0.020000 ( 0.021806)
0.020000 0.000000 0.020000 ( 0.023236)
0.020000 0.000000 0.020000 ( 0.022086)
0.030000 0.000000 0.030000 ( 0.023736)
圧倒的じゃないか\(^o^)/