rubyのstring

[ ruby 1.9.2p180 より ]

最近、Rubyで大量にString型を扱うプログラムを書く必要があったんけど、
初心者丸出しで以下のようなコードを書いたら、実行がクソ遅かった。

str = ""
10000.times do
  str += "ruby"
end

こんな遅さありかよ・・・
と思って、リファレンスを見たら

Stringクラス

self + other
文字列を連結した新しい文字列を返します。

とかクールに書いてあるじゃないか!?
オブジェクト作ってんのかよ!
ということは連結があるはず。

ありました。

Stringクラス

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^)/

タイトルとURLをコピーしました