Емкость StringBuilder по умолчанию - PullRequest
31 голосов
/ 29 октября 2008

Какова емкость по умолчанию StringBuilder?

А когда следует (или не следует) использовать значение по умолчанию?

Ответы [ 8 ]

42 голосов
/ 29 октября 2008

Емкость StringBuilder по умолчанию составляет 16 символов (я использовал .NET Reflector, чтобы выяснить это).

35 голосов
/ 29 октября 2008

Значение по умолчанию - 16, что, по-видимому, является емкостью по умолчанию для любого типа массива или списка в .NET Framework. Чем меньше перераспределений вам нужно в вашем 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 перераспределен в два раза по сравнению с его текущим размером.

12 голосов
/ 15 декабря 2011

Этот вопрос возник сегодня как дубликат другого, но я заметил, что одна часть не получила ответа. По умолчанию (при условии, что это означает, что «когда он не создан со строкой, которая достаточно велика, чтобы требовать этого»), как говорили люди, это 16, но я не вижу здесь ничего, когда вы должны изменить его.

Вы меняете его, когда это возможно, в качестве возможной оптимизации. Действительно, выбор 16 противоположен оптимизации. Оптимизация - это выбор значений и подходов таким образом, чтобы они особенно хорошо подходили для конкретного случая или подмножества возможных случаев (обычно не «ускоряя процесс», хотя мы часто используем это слово). Здесь разработчику класса пришлось иметь дело с обобщением - выбором значений и подходов, чтобы обеспечить достаточно хорошую производительность в широком диапазоне случаев.

Чем меньше они ушли, тем меньше использования памяти.

Чем они больше, тем меньше перераспределения для обработки больших строк.

Есть несколько причин, по которым бинарный раунд (целые степени двух) в некоторых случаях может дать лучшую производительность, чем другие числа, поэтому они выбрали одну из них, но этот выбор, кроме выбора между 4, 16 или 1024, был вопрос баланса различных вероятных значений.

Кто-то , использующий StringBuilder вместо того, чтобы проектировать его, может лучше понять, какого размера он может понадобиться.

Если они собираются на Append 5 однозначных чисел вместе со строками длиной до 43 символов, то общая длина StringBuilder составит 48 символов, независимо от того, что, поэтому они должны использовать емкость 48 при 48 всегда самый эффективный размер для струны длиной 48

Если они делают что-то, что может иметь длину от 23 до 34 символов, они должны использовать 34.

Если они делают что-то, что, вероятно, никогда не будет более 60 символов, но время от времени они могут быть, они должны использовать 64 (не перераспределять для большинства частей, и получить преимущество степени два) упомянуто выше для нескольких случаев, когда вы делаете).

Если по этому вопросу невозможно прийти к выводу или, по крайней мере, трудно это сделать, а не по горячим точкам производительности, вам следует просто использовать значение по умолчанию.

3 голосов
/ 29 октября 2008

Преподобный Дж. Скит предоставил хороший анализ именно этой проблемы:

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

1 голос
/ 20 сентября 2013

Мы можем найти емкость, используя свойство емкости класса StringBuilder:

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

Здесь емкость определяет емкость по умолчанию StringBuilder.

StringBuilder равен Max Capacity и соответствует максимальному значению Int32.

0 голосов
/ 11 октября 2017

Емкость String-Builder по умолчанию составляет 16 символов , Максимальная емкость String-Builder составляет 2147483647 символов .

Так что не нужно беспокоиться о сохранении длинного ответа !!!

0 голосов
/ 29 октября 2008

читать слышать о Stringbuilder емкость , есть пример приложения, чтобы доказать это тоже.

0 голосов
/ 29 октября 2008

[править: в то время задавался вопрос о StringList]

Вы имеете в виду StringCollection? Сначала используется пустой ArrayList, поэтому ответ равен 0. И у вас нет возможности изменить его. При первом добавлении предмета емкость увеличивается до 4, а затем используется стратегия удвоения при заполнении.

Если вы имеете в виду List<string>, то он похож (пустой T[], а не ArrayList), но вы можете инициализировать известный размер, если вам нужно (т.е. вы знаете, сколько данных вы ожидаете). Опять же, при первом увеличении Add до List<T> размер увеличивается до 4, а затем удваивается при каждом заполнении.

...