はじめに
今回は文字列の連結をするときにより高速に行う方法についての記事になります!
string型の文字列の連結の方法として、まずは+演算子が思いつくのではないでしょうか。
ただ大量の文字列を連結する際に+演算子で連結するのはややパフォーマンスが良くないみたいでした。
その代わりとしてStringBuilderクラスというものが推奨されています。
これについてみていきましょう。
パフォーマンスが良い理由
Stringオブジェクトは一度インスタンス化すると内容を変更することができないという性質があるようです。
つまり連結をするたびに新しいStringオブジェクトが作成されてしまいます。
これに対してStringBuilderクラスは内容を変更することができるので、余分なオブジェクトを生成しないようになり、パフォーマンスが良くなることが多いようです。
使い方
using UnityEngine; public class Test : MonoBehaviour { private void Start() { string s = "おなかすいた"; System.Text.StringBuilder sb = new System.Text.StringBuilder(); for(int i = 0; i < 1000; i++) { sb.Append(s); } Debug.Log(sb.ToString()) ; //おなかすいたおなかすいたおなかすいた・・・ } }
実際に処理時間を比較してみた
System.Diagnostics.Stopwatchクラスを用いて実際に上記のコードのループの回数を変化させながら、+演算子を用いた場合とStringBuilderクラスを用いた場合で比較をしてみました。
| ループの回数 | StringBuilderクラスの場合の処理時間(ms) |
+演算子の場合の処理時間(ms) |
|---|---|---|
| 1 | 0 | 0 |
| 10 | 0 | 0 |
| 100 | 0 | 0 |
| 1000 | 0 | 11 |
| 10000 | 2 | 2659 |
| 50000 | 10 | 68833 |

ループの回数が少ないときは両方とも計測できないほど処理時間が短いので、さほど気にする必要はないかもしれません。
ただループの回数が大きくなるとかなり処理時間に開きがでてきてしまいました。
さいごに
最後にグラフを見る限り、大量の文字列を連結をするときはStringBuilderクラスを使ったほうが良さそうみたいです。
是非うまく活用してみてください!