文字列の連結
Rubyにおける文字列の連結に関してどの方法で処理した方がコストが小さいかを調べてみます。PerlやJavaでの経験上ある程度の予測は付きますが。
テスト1: "+"による連結
buf = '' for i in 1..100000 buf += 'abc' end
テスト2: "<<"(concat)による連結
buf = '' for i in 1..100000 buf << 'abc' end
テスト3: 配列のjoin
arr = [] for i in 1..100000 arr.push('abc') end buf = arr.join()
結果
テスト1 | +による連結 | 29.462s |
テスト2 | concatによる連結 | 0.138s |
テスト3 | 配列のjoin | 0.150s |
テスト1が異常なほど時間がかかっているのは、Stringオブジェクトの生成コストのためであるのは明らかでしょう。やってはいけない典型例ですね。
テスト2が一番良い結果となりました。
テスト3はテスト2には少し劣りますがそんなに悪い結果ではありません。
文字列を繰り返して連結する場合はconcatを使うのが良いでしょう。