Ruby / 文字列の追加処理のパフォーマンス比較

Rubyで、ある文字列の後に別の文字列を追加(連結)したい場合、<<や+=などいくつか方法があります。
どれが一番早いのか気になったのでパフォーマンスを比較してみました。

require "benchmark"
Benchmark.bm do |x|
  str = ''; x.report('+=') { 10000.times{ str += "abcdefg" } }
  str = ''; x.report('<<') { 10000.times{ str << "abcdefg" } }
  str = ''; x.report('+') { 10000.times{ str = str + "abcdefg" } }
  str = ''; x.report('#{}') { 10000.times{ str = "#{str}abcdefg" } }
end

結果は・・・

      user     system      total        real
+=   0.220000   0.420000   0.640000 (  0.643629)
<<  0.000000   0.000000   0.000000 (  0.007104)
+  0.220000   0.410000   0.630000 (  0.638200)
#{}  0.230000   0.440000   0.670000 (  0.698459)

ということで、<<演算子の圧勝という結果になりました。

+や#{}が遅いのは何となく分かりますが、+=のパフォーマンスが想像以上に悪かったのが驚きです。
パフォーマンス重視のプログラムで文字列の結合をする場合には、できるだけ<<演算子を使うようにすると良いかもしれません。
以上、ご参考まで。


この記事について