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

Использует ли StringBuilder больше памяти, чем конкатенация строк?

Я знаю, что очевидное преимущество производительности при использовании StringBuilder в С#, но какова разница в памяти?

Использует ли StringBuilder больше памяти? и как побочная заметка, что, по сути, делает stringbuilder по-разному, что делает его намного быстрее?

4b9b3361

Ответ 1

Короткий ответ: StringBuilder подходит в случаях, когда вы конкатенируете произвольное количество строк, которые вы не знаете во время компиляции.

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

Пример 1: Вы хотите комбинировать "cat", "dog" и "mouse". Это ровно 11 символов. Вы можете просто выделить массив char[] длиной 11 и заполнить его символами из этих строк. Это по существу то, что делает string.Concat.

Пример 2: вы хотите присоединиться к неуказанному количеству предоставленных пользователем строк в одну строку. Так как количество данных для конкатенации неизвестно заранее, использование StringBuilder является подходящим в этом случае.

Ответ 2

StringBuilder не обязательно быстрее. Насколько я помню, если вы объединяете менее дюжины строк, то строка concatentation (eiether через String.Concat или простая str1 + str2) выполняется быстрее. Причина в том, что выделение и инициализация StringBuilder на самом деле требует времени.

Причина, по которой StringBuilder быстрее, заключается в том, что он создает внутренний буфер, в который он добавляет строки. Если вы объединяете 20 строк, StringBuilder просто добавляет один за другим в свой буфер и, наконец, возвращает результат по запросу - с помощью метода ToString(). (Я предполагаю, что имеется достаточное пространство для буфера. В противном случае StringBuilder беспокоится о перераспределении буфера и имеет эвристику, чтобы помочь ему не перераспределять слишком много раз.) Если бы вы были concatentating strings, каждая строка concat могла бы выделить новую строку length (str1.Length + str2.Length) и скопируйте первую и вторую строку на место. Это приводит к повторному копированию строк.

var result = str1 + str2 + str3 + ... + strN;

Для этого потребуются N-1 распределения и операции копирования N-1. Это может стать очень дорогостоящим для большого N. Плюс отметить, что вы копируете содержимое str1 N-1 раз. Один раз, чтобы получить результат str1 + str2. Затем снова получить результат (str1 + str2) + str3. С помощью StringBuilder каждая строка копируется во внутренний буфер только один раз, предполагая, что буфер достаточно велик, чтобы удерживать отдельные строки.