C#で文字列を結合する際のパフォーマンスを調べてみました。
目次
- 概要
- 検証1
- 検証2
- マイクロソフトの資料
1. 概要
今回の記事の概要は以下の通りです。
- StringBuilderより、+の結合が速い場合もある。
- StringBuilderは、結合数が分からない場合などに向いている。
2. 検証1
以下のコードを実行すると、+演算子を使う連結のほうが速かったです。
using System.Diagnostics; using System.Text; var watch =new Stopwatch(); watch.Start(); watch.Stop(); // +で連結 watch.Restart(); for (var i =0; i <100000000; i++) { var s ="str1"+"str2"; } watch.Stop(); Console.WriteLine(watch.Elapsed); // StringBuilderで連結 watch.Restart(); for (var i =0; i <100000000; i++) { var s =new StringBuilder(); s.Append("str1").Append("str2"); } watch.Stop(); Console.WriteLine(watch.Elapsed);
StringBuilderのコードは、インスタンス化する回数が多くなるほど遅くなりそうです。
3. 検証2
以下のコードだと、StringBuilderのほうが速かったです。
// +で連結 watch.Restart(); var str =""; for (var i =0; i <100000; i++) { str +="str1"; } watch.Stop(); Console.WriteLine(watch.Elapsed); // StringBuilderで連結 watch.Restart(); var sb =new StringBuilder(); for (var i =0; i <100000; i++) { sb.Append("str1"); } watch.Stop(); Console.WriteLine(watch.Elapsed);
StringBuilderのインスタンス化は一回となっています。
4. マイクロソフトの資料
Microsoftの資料だと、StringBuilderについて以下の記載がありました。
結合するソース文字列の数がわからないループ内の文字列を結合する場合、ソース文字列の実際の数は大きくなる可能性があります。 StringBuilderクラスは、このようなシナリオのために設計されています。