StringBuilder のデフォルトの容量
-
05-07-2019 - |
質問
のデフォルトの容量はどれくらいですか StringBuilder
?
そして、デフォルトを使用すべき(またはすべきでない)のはどのような場合でしょうか?
解決
Venerable J. Skeetは、この問題の正確な分析を提供しました。
他のヒント
StringBuilderのデフォルトの容量は16文字です(見つけるには.NET Reflectorを使用しました)。
デフォルトは16です。これは、.NETフレームワークの任意のタイプの配列またはリストのデフォルト容量のようです。 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 の累乗全体) が他の数値よりもパフォーマンスが向上する可能性が高い理由はいくつかあります。そのため、そのいずれかを選択しましたが、それはさておき、4 か 16 か 1024 のどちらを選択するかは問題でした。さまざまな可能性のある値のバランスを取る。
誰か を使用して StringBuilder
デザインするよりも、どのくらいのサイズが必要になるかをよりよく理解できるかもしれません。
彼らがそうするつもりなら Append
5 つの 1 桁の数字と合計 43 文字の長さの文字列、 StringBuilder
は何があっても 48 文字になるため、長さ 48 の文字列では常に 48 が最も効率的なサイズであるため、48 の容量を使用する必要があります。
約 23 ~ 34 文字の長さになる可能性がある何かを実行している場合は、34 文字を使用する必要があります。
60 文字を超えることはまずないが、場合によっては 60 文字を超える可能性がある何かを実行している場合は、64 を使用する必要があります (ほとんどの部分に再割り当てせず、次の部分については前述の 2 の累乗の利点が得られます)。そうするケースはほとんどありません)。
これに関して結論を出すことが不可能な場合、または少なくとも結論を出すのが難しく、パフォーマンスのホットスポットではない場合は、デフォルトを使用する必要があります。
StringBuilder
クラスの容量プロパティを使用して容量を見つけることができます:
StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;
ここで、キャパシティはMax Capacity
のデフォルトキャパシティを定義します。
Int32
は<=>は<=>の最大値と同じです。
[編集:当時、質問はStringList
]について尋ねました
という意味はStringCollection
ですか?これは最初は空のArrayList
を使用するため、答えは0です。また、変更するオプションはありません。アイテムを最初に追加すると、容量は4にジャンプし、いっぱいになると2倍の戦略を使用します。
List<string>
を意味する場合、それは似ています(空のT[]
であり、Add
ではありません)が、必要に応じて既知のサイズを初期化できます(つまり、予想されるデータの量がわかっています)。繰り返しますが、初めてList<T>
を<=>にすると、サイズは4にジャンプし、それがいっぱいになるたびに2倍になります。
String-Builderのデフォルトの容量は 16文字です。 また、String-Builderの最大容量は 2147483647文字です。
したがって、長い応答を保存する必要はありません!!!
Stringbuilderの容量について読む 、それを証明するサンプルアプリもあります。