Подтвердить что ты не робот

Стандартная емкость StringBuilder

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

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

4b9b3361

Ответ 2

По умолчанию для StringBuilder используется 16 символов (я использовал .NET Reflector для поиска).

Ответ 3

Значение по умолчанию - 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 слишком мал для записи следующей строки, внутренний массив char StringBuilder перераспределяется в два раза по сравнению с его текущим размером.

Ответ 4

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

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

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

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

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

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

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

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

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

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

Ответ 5

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

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

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

StringBuilder Max Capacity совпадает с максимальным значением Int32.

Ответ 6

[edit: в то время вопрос о StringList]

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

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

Ответ 7

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

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

Ответ 8

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