string1
とのサイズがわからないと言うことは不可能string2
です。
を呼び出すとAppendFormat
、フォーマット文字列と挿入される文字列の長さが指定された場合に1回だけバッファが事前に割り当てられ、すべてが連結されてバッファに挿入されます。非常に大きな文字列の場合、これはAppend
、バッファが複数回拡張される可能性のある個別の呼び出しよりも有利です。
ただし、への3回の呼び出しAppend
は、バッファーの拡張をトリガーする場合とトリガーしない場合があり、そのチェックは呼び出しごとに実行されます。AppendFormat
文字列が十分に小さく、バッファ拡張がトリガーされない場合は、置換を行う場所を特定するためにフォーマット文字列を解析する必要がないため、呼び出しよりも高速になります。
決定的な答えを得るには、より多くのデータが必要です
クラスで静的Concat
メソッドString
を使用することについてはほとんど議論されていないことに注意してください(Jonの答えはこれをAppendWithCapacity
思い出させました)。彼のテスト結果は、最良のケースであることを示しています(特定のフォーマット指定子を利用する必要がないと仮定した場合)。 String.Concat
バッファを連結して事前に割り当てる文字列の長さを事前に決定するという点で同じことを行います(パラメータを介して構造をループするため、オーバーヘッドがわずかに増加します)。AppendWithCapacity
その性能はジョンの方法に匹敵するでしょう。
または、単純な加算演算子です。String.Concat
とにかく呼び出しにコンパイルされるため、すべての加算が同じ式であることに注意してください。
// One call to String.Concat.
string result = a + b + c;
いいえ
// Two calls to String.Concat.
string result = a + b;
result = result + c;
テストコードを提出するすべての人のために
テストケースを別々の実行で実行する必要があります(または、少なくとも、別々のテスト実行の測定の間にGCを実行します)。これは、1,000,000回実行すると、StringBuilder
1つのテストのループの各反復で新しいテストが作成され、次に同じ回数ループする次のテストを実行して、追加の1,000,000StringBuilder
インスタンスであるGCが作成されるためです。 2回目のテスト中に介入し、そのタイミングを妨げる可能性が高くなります。