2009年5月23日土曜日

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)

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

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

1 件のコメント:

  1. [jruby] 文字列の追加処理のパフォーマンス

    TECSの半分は,raccを用いた構文解析,残りの半分はファイルの生成.つまり,文字列操作がパフォーマンスに与える影響はムチャクチャ大きい.OutOfMemoryError で落ちるのはとりあえず横に...

    返信削除