【C#】文字列連結をstringとStringBuilderで行った際のパフォーマンス差異
文字列連結はStringBuilderで行った方がパフォーマンスが良い
C#で文字列連結を行う際は、パフォーマンスの観点から基本的にstringではなく、StringBuilderを使用する。
stringで連結をすると、連結の度にstringオブジェクトが作成される。
また、不要になったstringオブジェクトのガベージコレクションも走る。
オブジェクトの生成、破棄はそれなりにオーバヘッドの高い処理なので、例えばループの中などで生成・破棄を繰り返すと、トータルでかなりの処理時間がかかることもある。
例えば、ループで1万回文字列連結を行った際の所要時間は以下のようになる。
string…125ミリ秒
StringBuilder…37ミリ秒
1 2 3 4 5 6 7 8 9 10 11 12 |
var sw = new System.Diagnostics.Stopwatch(); sw.Start(); //stringで文字列連結した場合 string tmp = ""; for (int i = 1; i <= 10_000; i++) { tmp += i.ToString(); } sw.Stop(); Console.WriteLine($"{sw.ElapsedMilliseconds}ms"); //125ミリ秒 |
1 2 3 4 5 6 7 8 9 10 11 12 |
var sw = new System.Diagnostics.Stopwatch(); sw.Start(); //StringBuilderで連結した場合 StringBuilder sb = new StringBuilder(); for (int i = 1; i <= 10_000; i++) { sb.Append(i.ToString()); } sw.Stop(); Console.WriteLine($"{sw.ElapsedMilliseconds}ms"); //37ミリ秒 |
しかし、少量の場合はstringで連結した方が早い
しかし、いつでもStringBuilderで処理すればいいというわけではなく、少ない量なら+演算子で連結した方が早い。(StringBuilderオブジェクト生成の方がコストが高い)
・string…64ミリ秒(stringオブジェクトを4千万回生成)
・StringBuilder…759ミリ秒(StringBuilderを1千万回生成)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
var sw = new System.Diagnostics.Stopwatch(); sw.Start(); //stringで連結 sw.Start(); for (int i = 1; i <= 10_000_000; i++) { string temp = "あ" + "い" + "う"; } sw.Stop(); Console.WriteLine($"{sw.ElapsedMilliseconds}ms"); //64ミリ秒(stringオブジェクトを4千万回生成) //StringBuilderで連結 sw.Reset(); sw.Start(); for (int i=1; i<=10_000_000; i++) { StringBuilder sb = new StringBuilder(); sb.Append("あ"); sb.Append("い"); sb.Append("う"); } sw.Stop(); Console.WriteLine($"{sw.ElapsedMilliseconds}ms"); //759ミリ秒(StringBuilderを1千万回生成) |