Емкость StringBuilder по умолчанию
Какова емкость по умолчанию StringBuilder
?
И когда следует (или не следует) использовать значение по умолчанию?
8 ответов
Преподобный Дж. Скит предоставил хороший анализ именно этой проблемы:
Емкость 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 перераспределяется в два раза больше его текущего размера.
Этот вопрос возник сегодня как дубликат другого, но я заметил, что одна часть не получила ответа. По умолчанию (при условии, что это означает, что "когда он не создан со строкой, которая достаточно велика, чтобы требовать этого"), как говорили люди, это 16, но я не вижу здесь ничего, когда вы должны изменить его.
Вы можете изменить его, когда сможете сделать это как возможную оптимизацию. Действительно, выбор 16 противоположен оптимизации. Оптимизация - это выбор ценностей и подходов, чтобы они особенно хорошо подходили к конкретному случаю или подмножеству возможных случаев (обычно не "ускоряя процесс", хотя мы часто используем это слово). Здесь разработчик класса должен был иметь дело с обобщением - подбором ценностей и подходов, чтобы обеспечить достаточно хорошую производительность в широком диапазоне случаев.
Чем меньше они пошли, тем меньше использования памяти.
Чем больше они пошли, тем меньше перераспределения для обработки больших строк.
Есть несколько причин, по которым бинарный раунд (целые степени двух), вероятно, даст лучшую производительность, чем другие числа, в некоторых случаях, поэтому они выбрали одну из них, но выбор между 4, 16 или 1024 был вопросом балансировка разных вероятных значений.
Кто-то использует StringBuilder
вместо того, чтобы спроектировать его, может быть лучше понять, какой размер им может понадобиться.
Если они собираются Append
5 однозначных чисел вместе со строками общей длиной до 43 символов, а затем общая длина StringBuilder
будет 48 символов, несмотря ни на что, поэтому они должны использовать емкость 48, так как 48 всегда самый эффективный размер для строки длиной 48.
Если они делают что-то, что может иметь длину от 23 до 34 символов, они должны использовать 34.
Если они делают что-то, что, вероятно, никогда не будет более 60 символов, но время от времени они могут быть, они должны использовать 64 (не перераспределять для большинства частей, и получить преимущество в степени двух, упомянутое выше для несколько случаев, когда вы делаете).
Если невозможно прийти к какому-либо заключению по этому поводу или, по крайней мере, трудно сделать это, а не "горячую точку" производительности, вам следует просто использовать значение по умолчанию.
Емкость String-Builder по умолчанию составляет 16 символов, а максимальная емкость String-Builder составляет 2147483647 символов.
Так что не нужно беспокоиться о хранении длинного ответа!!!
Мы можем найти емкость, используя свойство емкости StringBuilder
Учебный класс:
StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;
Здесь емкость определяет емкость по умолчанию StringBuilder
,
StringBuilder
является Max Capacity
такое же, как максимальное значение Int32
,
[править: в то время вопрос задавался о StringList
]
Ты имеешь ввиду StringCollection
? Это использует пустой ArrayList
изначально, поэтому ответ 0. И у вас нет возможности изменить его. Когда вы впервые добавляете предмет, емкость увеличивается до 4, а затем использует стратегию удвоения при заполнении.
Если ты имеешь ввиду List<string>
, то похоже (пустой T[]
не ArrayList
), но вы можете инициализировать известный размер, если вам нужно (т.е. вы знаете, сколько данных вы ожидаете). Опять первый раз Add
к List<T>
размер скачет до 4, а затем удваивается каждый раз, когда он заполняется.
Читайте информацию о возможностях Stringbuilder, также есть пример приложения, чтобы доказать это.