String vs. StringBuilder - PullRequest
       121

String vs. StringBuilder

201 голосов
/ 16 сентября 2008

Я понимаю разницу между String и StringBuilder (StringBuilder изменяемый), но есть ли большая разница в производительности между ними?

В программе, над которой я работаю, добавлено много строк (500+). Является ли использование StringBuilder лучшим выбором?

Ответы [ 24 ]

2 голосов
/ 16 сентября 2008

В .NET StringBuilder все еще быстрее, чем добавление строк. Я уверен, что в Java они просто создают StringBuffer под капотом, когда вы добавляете строки, так что на самом деле разницы нет. Я не уверен, почему они еще не сделали этого в .NET.

2 голосов
/ 18 июня 2010
2 голосов
/ 16 сентября 2008

Я наблюдал значительный прирост производительности при использовании вызова метода EnsureCapacity(int capacity) в экземпляре StringBuilder перед его использованием для хранения строк. Я обычно называю это в строке кода после создания экземпляра. Это имеет тот же эффект, как если бы вы создали экземпляр StringBuilder следующим образом:

var sb = new StringBuilder(int capacity);

Этот вызов заблаговременно выделяет необходимую память, что приводит к меньшему выделению памяти во время нескольких операций Append(). Вы должны сделать обоснованное предположение о том, сколько памяти вам понадобится, но для большинства приложений это не должно быть слишком сложным. Я обычно ошибаюсь из-за того, что у меня слишком много памяти (мы говорим 1к или около того).

2 голосов
/ 16 сентября 2008

Я считаю, что StringBuilder работает быстрее, если у вас есть более 4 строк, которые нужно добавить вместе. Кроме того, он может делать некоторые интересные вещи, такие как AppendLine.

2 голосов
/ 16 сентября 2008

Использование строк для объединения может привести к сложности времени выполнения порядка O(n^2).

Если вы используете StringBuilder, копирование памяти требует гораздо меньше усилий. С StringBuilder(int capacity) вы можете повысить производительность, если сможете оценить, насколько большим будет конечный String. Даже если вы не точны, вам, вероятно, придется увеличить емкость StringBuilder только пару раз, что также может повысить производительность.

1 голос
/ 16 сентября 2008

Конкатенация строк обойдется вам дороже. В Java вы можете использовать либо StringBuffer, либо StringBuilder в зависимости от ваших потребностей. Если вы хотите синхронизированную и поточно-ориентированную реализацию, перейдите к StringBuffer. Это будет быстрее, чем конкатенация строк.

Если вам не требуется синхронизированная или поточно-ориентированная реализация, перейдите к StringBuilder. Это будет быстрее, чем конкатенация строк, а также быстрее, чем StringBuffer, так как они не требуют дополнительной синхронизации.

1 голос
/ 16 сентября 2008

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

ИМХО, при добавлении более 500 строковых записей обязательно следует использовать StringBuilder.

1 голос
/ 16 сентября 2008

String и StringBuilder фактически неизменны, StringBuilder имеет встроенные буферы, которые позволяют более эффективно управлять его размером. Когда StringBuilder необходимо изменить размер, это когда он перераспределяется в куче. По умолчанию он имеет размер до 16 символов, вы можете установить его в конструкторе.

например.

StringBuilder sb = новый StringBuilder (50);

0 голосов
/ 16 сентября 2008

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

0 голосов
/ 16 сентября 2008

StringBuilder, вероятно, предпочтительнее. Причина в том, что он выделяет больше места, чем требуется в настоящее время (вы устанавливаете количество символов), чтобы оставить место для будущих добавлений. Тогда те будущие добавления, которые помещаются в текущий буфер, не требуют выделения памяти или сборки мусора, что может быть дорогостоящим. В общем, я использую StringBuilder для сложной конкатенации строк или многократного форматирования, затем преобразую в обычную строку после завершения данных, и мне снова нужен неизменный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...