17

重複の可能性:
Is String.Format as efficient as StringBuilder
C# String output: format or concat?String.Formatと "string" + "string"またはStringBuilder?

性能優先とどのような次のそれぞれを好むための条件であるべきです:

String.Format("{0}, {1}", city, state); 

または

city + ", " + state; 

または

StringBuilder sb = new StringBuilder(); 
sb.Append(city); 
sb.Append(", "); 
sb.Append(state); 
sb.ToString(); 
+2

@Shimmy:このhttp://stackoverflow.com/questions/6785/is-string-format-as-efficient-as-stringbuilder – shahkalpesh

+0

http://blogs.msdnをご覧ください。com/b/ricom/archive/2004/03/12/performance-quiz-a-series.aspx – Freelancer

+1

http://www.codinghorror.com/blog/archives/001218.html – Freelancer

答えて

18
  • コンパイラは、できるだけ多くの文字列連結それができるように最適化します。
  • 変数との連結はString.Concatにコンパイルされます
  • StringBuilderは、文字列に対していくつかの(10以上の)推測 "変更"を行っているとかなり速くなりますが、必要なときよりも多くの領域をバッファに割り当て、必要に応じて内部バッファのサイズを変更します。

私は個人的には二つの理由からString.Formatのほぼすべての時間のを使用します。これは、変数の束を再配置するよりも、フォーマット文字列を維持するために非常に簡単です

  • String.Formatは、文字列に埋め込まれたIFormattable型(数値など)に渡されるIFormatProviderを受け取り、指定されたカルチャに対して適切な数値書式を取得し、値の書式設定を全体的に制御します。例えば

、いくつかの文化が小数点としてコンマを使用するので、あなたが番号を使用すると、予定の道をフォーマットされたことを確認したい場合は、CultureInfo.InvariantCultureを指定することのStringBuilderまたはString.Formatのいずれかで確保したいと思います。

つ注意すべきより多くの事...

  • のStringBuilderはまた、あなたの不要な第2のバッファを必要とせずにString.Formatの柔軟性を与えるAppendFormat機能を持っています。
  • StringBuilderを使用する場合は、渡すパラメータをAppendに連結して目的を無効にしないようにしてください。見逃すのは簡単です。
1

該当diferenceはありません。しかし、String.Formatが内部的にStringBuilder(Reflectorツールで見ることができる)を使用していると仮定すると、直接StringBuilder.Appendを使用する方が高速になります。

EDIT:連結する各文字列に対して新しい文字列インスタンスを作成するため、 "+"演算子を使用するのは最悪のオプションです。通常、リテラル単一の文字列に最適化することができ、単に改行のために分割されている例文字列のよう

+0

は間違っている、それは私が最良の方法であると思われる投稿によると、 – Shimmy

+1

@ shimmy、そのリンクにはStringBuilderがありません。また、そのテストでは、3つのストリングのみを連結します。ストリングの数はパフォーマンスに大きな影響を与えます。 –

+0

編集が間違っています。 C#コンパイラは、文字列またはオブジェクトを配列にアセンブルし、String.Concat()を呼び出します。 String.Concat(string [])は、文字列を正確に正しい長さに割り当てることができるため、最も効率的です。 –

関連する問題