Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

По умолчанию установлено значение 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 перераспределен в два раза по сравнению с его текущим размером.

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

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

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

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

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

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

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

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

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

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

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

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

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

Int32 равно <=> и соответствует максимальному значению <=>.

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top