web-dev-qa-db-ja.com

StringBuilderのデフォルト容量

StringBuilderのデフォルトの容量はどれくらいですか?

そして、いつデフォルトを使用すべきか(またはすべきではないか)?

32
Matt Lacey

由緒あるJ.スキートは、まさにこの問題の優れた分析を提供しました。

https://jonskeet.uk/csharp/stringbuilder.html

3
endian

StringBuilderのデフォルトの容量は16文字です(私は.NET Reflectorを使用して調べました)。

43
Alan

デフォルトは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倍に再割り当てされます。

35
baretta

この質問は今日、別の質問の複製として出てきましたが、一部が回答されていないことに気付きました。人々が言っ​​たように、デフォルト(「必要な大きさの文字列で作成されていない場合)は16ですが、変更する必要がある場合はここには何も表示されません。

可能な最適化として、可能な場合は変更します。実際、16の選択は、最適化の反対です。 最適化は、特定のケースまたは考えられるケースのサブセットに特によく合うように値とアプローチを選択します(一般的に「物事を速くする」ことではありませんが、Wordをよく使用します)。ここで、クラスの設計者は、一般化-幅広いケースで適度に優れたパフォーマンスを提供するために、値とアプローチを選択する必要がありました。

小さければ小さいほど、メモリの使用量は少なくなります。

それらが大きくなるほど、より大きな文字列を処理するための再割り当てが少なくなります。

バイナリラウンド(2の累乗)が特定の場合に他の数値よりも優れたパフォーマンスを提供する可能性が高い理由はいくつかあるので、そのうちの1つを選びましたが、4、16、または1024の選択は別として問題でした異なる可能性のある値のバランスを取ります。

誰かsingStringBuilderを設計するのではなく、彼らが必要とする可能性のあるサイズについてより良い考えを持っているかもしれません。

Append 5個の1桁の数字と、合計43文字の文字列を使用する場合、StringBuilderの合計の長さは何があっても48文字になります。 48は、48の長さのストリングに対して常に最も効率的なサイズであるため、48の容量を使用する必要があります。

約23〜34文字の長さの可能性がある何かを実行している場合は、34を使用する必要があります。

60文字を超えることはないだろうが、時々ある可能性がある場所で何かをしている場合は、64を使用する必要があります(ほとんどの部分に再割り当てせず、上記の2の累乗の利点を得るあなたがするいくつかのケース)。

これについて結論を出すことが不可能な場合、または少なくともそうするのが難しく、パフォーマンスのホットスポットではない場合は、デフォルトを使用する必要があります。

12
Jon Hanna

StringBuilderクラスのcapacityプロパティを使用して容量を見つけることができます。

StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;

ここで、容量はStringBuilderのデフォルト容量を定義します。

StringBuilderMax CapacityInt32の最大値と同じです。

1
user2761122

String-Builderのデフォルトの容量は16文字であり、String-Builderの最大容量は2147483647文字です。

したがって、長い応答を保存することを心配する必要はありません!!!

0
Deep Jadia

[編集:当時、質問はStringListについて尋ねられました]

StringCollectionのことですか?これは最初は空のArrayListを使用するので、答えは0です。そしてそれを変更するオプションはありません。最初にアイテムを追加すると、容量は4にジャンプし、いっぱいになると倍増戦略を使用します。

あなたが意味するならList<string>、それからそれは似ています(空のT[]ArrayListではありません)が、必要に応じて既知のサイズを初期化できます(つまり、予想されるデータの量がわかっています)。繰り返しますが、初めてAddからList<T>サイズは4にジャンプし、いっぱいになるたびに2倍になります。

0
Marc Gravell