StringBuilderの利点を理解しています。
しかし、2つの文字列を連結したい場合は、StringBuilderなしで連結する方が良い(速い)と思います。これは正しいです?
どの時点(文字列の数)でStringBuilderを使用する方が良いですか?
StringBuilderの利点を理解しています。
しかし、2つの文字列を連結したい場合は、StringBuilderなしで連結する方が良い(速い)と思います。これは正しいです?
どの時点(文字列の数)でStringBuilderを使用する方が良いですか?
ジェフ・アトウッドによる「マイクロ最適化シアターの悲しい悲劇」を読むことを強くお勧めします。
SimpleConcatenation対StringBuilder対他のメソッドを扱います。
さて、あなたがいくつかの数字とグラフを見たいならば、リンクをたどってください;)
しかし、2つの文字列を連結したい場合は、StringBuilderなしで行う方が良い(速い)と思います。これは正しいです?
それは確かに正しいです、あなたは正確に説明された理由を見つけることができます:
http://www.yoda.arachsys.com/csharp/stringbuilder.html
要約:文字列を一度に連結できる場合は、次のようになります
var result = a + " " + b + " " + c + ..
コピーが作成される場合にのみ、StringBuilderを使用しない方がよいでしょう(結果の文字列の長さは事前に計算されます)。
のような構造のために
var result = a;
result += " ";
result += b;
result += " ";
result += c;
..
毎回新しいオブジェクトが作成されるため、StringBuilderを検討する必要があります。
最後に、この記事はこれらの経験則を要約しています。
経験則
では、いつStringBuilderを使用する必要があり、いつ文字列連結演算子を使用する必要がありますか?
自明でないループで連結する場合、特に(コンパイル時に)ループで何回反復するかがわからない場合は、必ずStringBuilderを使用してください。たとえば、一度に1文字ずつファイルを読み取り、+ =演算子を使用して文字列を作成すると、パフォーマンスが低下する可能性があります。
1つのステートメントで連結する必要があるすべてのものを(読みやすく)指定できる場合は、必ず連結演算子を使用してください。(連結するものがたくさんある場合は、String.Concatを明示的に呼び出すか、区切り文字が必要な場合はString.Joinを呼び出すことを検討してください。)
リテラルをいくつかの連結ビットに分割することを恐れないでください-結果は同じになります。たとえば、パフォーマンスを損なうことなく、長いリテラルを数行に分割することで、読みやすさを向上させることができます。
連結の次の反復をフィードする以外の目的で連結の中間結果が必要な場合、StringBuilderは役に立ちません。たとえば、ファーストネームとラストネームからフルネームを作成し、最後に3番目の情報(ニックネームなど)を追加すると、StringBuilderを使用するメリットが得られるのは、そうでない場合のみです。他の目的で(名+姓)文字列が必要です(Personオブジェクトを作成する例のように)。
実行する連結がいくつかあり、それらを別々のステートメントで実行したい場合は、どちらに進むかは重要ではありません。どちらの方法がより効率的かは、関係する文字列のサイズの連結の数と、それらが連結される順序によって異なります。コードの一部がパフォーマンスのボトルネックであると本当に信じている場合は、両方の方法でプロファイリングまたはベンチマークを行ってください。
System.Stringは不変のオブジェクトです。つまり、コンテンツを変更するたびに新しい文字列が割り当てられ、これには時間(およびメモリ?)がかかります。StringBuilderを使用すると、新しいオブジェクトを割り当てずに、オブジェクトの実際のコンテンツを変更できます。
したがって、文字列に多くの変更を加える必要がある場合は、StringBuilderを使用してください。
実際にはそうではありません...大きな文字列を連結する場合、またはループのように多くの連結がある場合は、StringBuilderを使用する必要があります。
言い換えると
それならあなたは3つまで数えなければなりません。それ以上でもそれ以下でもありません。三はあなたが数えなければならない数であり、数えている数は三でなければならない。4つは数えないでください。2つも数えないでください。ただし、3つに進んでください。3番目の数字である3番目の数字に到達したら、アンティオキアの聖なる手榴弾をロブベストします。
私は通常、3つ以上の文字列の連結をもたらすコードのブロックに文字列ビルダーを使用します。
しかし、2つの文字列を連結したい場合は、StringBuilderを使用しない方がより適切で高速であると思います。これは正しいです?
はい。しかし、もっと重要なことは、そのような状況でバニラを使用する方がはるかに読みやすいことです。String
一方、ループで使用することは理にかなっており、連結と同じくらい読みやすくなります。
特定の数の連結をしきい値として引用する経験則には注意が必要です。ループ(およびループのみ)で使用することは、おそらく同じように便利で、覚えやすく、より理にかなっています。
決定的な答えはありません。経験則のみです。私自身の個人的なルールは次のようになります。
StringBuilder
.StringBuilder
.StringBuilder
ます。連結の数(a + b + c ...)を物理的に入力できる限り、大きな違いはありません。Nの2乗(N = 10)は100倍の速度低下であり、それほど悪くはありません。
大きな問題は、何百もの文字列を連結する場合です。N = 100では、10000倍の速度低下が発生します。これはかなり悪いです。
いつ使うか使わないかの境界線はないと思います。もちろん、誰かが大規模なテストを行って最適な条件を導き出した場合を除きます。
私にとっては、2 つの巨大な文字列を連結するだけであれば、StringBuilder は使用しません。非決定論的なカウントのループがある場合、たとえループが小さなカウントであっても、そうなる可能性があります。
単一の連結は、StringBuilderを使用する価値がありません。私は通常、経験則として5つの連結を使用しました。