のデフォルトの容量はStringBuilder
?
そして、いつデフォルトを使用する必要がありますか(または使用しないでください)?
StringBuilder のデフォルトの容量は 16 文字です (調べるために .NET Reflector を使用しました)。
デフォルトは16です。これは、.NETFrameworkの任意のタイプの配列またはリストのデフォルト容量のようです。StringBuilderで必要な再割り当ての数が少ないほど、優れています。一方、必要以上に割り当てる必要もありません。
私は通常、StringBuilderの最終的なサイズに関して、ある種の概算でStringBuilderをインスタンス化します。たとえば、これは、後で文字列を作成するために使用する反復回数に基づいて、この反復で各アイテムに必要なサイズを掛けたものにすることができます。
// where 96 is a rough estimate of the size needed for each item
StringBuilder sb = new StringBuilder ( count * 96 );
for ( int i = 0; i < count; i++ )
{
...
}
StringBuilderのサイズが小さすぎて次の文字列を書き込めない場合、StringBuilderの内部char配列は現在のサイズの2倍に再割り当てされます。
この質問は今日、別の質問の重複として出てきましたが、一部が回答されていないことに気付きました. デフォルト(「 require に十分な大きさの文字列で作成されていない場合」を意味すると仮定すると)は、人々が言ったように 16 ですが、いつ変更する必要があるかはわかりません。
可能な最適化として変更できる場合は変更します。実際、16 という選択は最適化の反対です。最適化とは、特定のケースまたは考えられるケースのサブセットに特に適した値とアプローチを選択することです (一般的に「高速化」という言葉はよく使われますが、「高速化」ではありません)。ここで、クラスの設計者は一般化に対処しなければなりませんでした。値とアプローチを選択して、幅広いケースで適度に優れたパフォーマンスを実現する必要がありました。
小さいほど、メモリの使用量が少なくなります。
それらが大きくなるほど、より大きな文字列を処理するための再割り当てが少なくなります。
バイナリ ラウンド (2 のべき乗) が特定の場合に他の数値よりも優れたパフォーマンスを発揮する可能性が高い理由はいくつかあります。さまざまな可能性のある値のバランスを取ります。
それを設計するのではなく使用する人は、必要になる可能性が高いサイズについてより良い考えを持っているかもしれません. StringBuilder
Append
5 つの 1 桁の数字と合計で 43 文字の長さの文字列を使用する場合、文字列の合計の長さはStringBuilder
何があっても 48 文字になるため、48 は常に長さ 48 のストリングの最も効率的なサイズ。
約 23 から 34 文字の長さになる可能性のある何かを実行している場合は、34 を使用する必要があります。
60 文字を超えることは決してないだろうが、ときどき存在する可能性がある何かを行っている場合は、64 を使用する必要があります (ほとんどの部分を再割り当てしないでください。あなたがするいくつかのケース)。
これについて結論を出すことが不可能な場合、または少なくともそうするのが難しく、パフォーマンスのホットスポットでない場合は、デフォルトをそのまま使用する必要があります。
由緒ある J. スキートは、この問題を正確に分析しています。
String-Builder のデフォルト容量は16 文字であり、String-Builder の最大容量は2147483647 文字です。
したがって、長い応答を保存することを心配する必要はありません!!!
[編集: 当時、について尋ねられた質問StringList
]
ということStringCollection
ですか?これは最初に空を使用するArrayList
ため、答えは 0 です。これを変更するオプションはありません。最初にアイテムを追加すると、容量が 4 にジャンプし、いっぱいになると 2 倍の戦略が使用されます。
を意味する場合List<string>
、それは似ています (T[]
ではなく空のArrayList
) が、必要に応じて既知のサイズを初期化できます (つまり、予想されるデータの量がわかっています)。繰り返しますが、最初Add
にList<T>
サイズが 4 にジャンプし、それがいっぱいになるたびに 2 倍になります。
Stringbuilder の容量について聞いてみてください。それを証明するサンプル アプリもあります。