concatenate - Java: String concat vs StringBuilder-оптимизирован, и что мне делать?




stringbuilder vs string c# (3)

Возможно, я неправильно понял ваш вопрос, но StringBuilder быстрее при добавлении строк. Итак, да, если вы добавляете «сотни тысяч строк», вам определенно следует использовать StringBuilder (или StringBuffer, если вы используете многопоточное приложение).

(Более подробный ответ в комментариях)

https://code.i-harness.com

В этом ответе говорится (подразумевает), что конкатенация String оптимизирована в операциях StringBuilder в любом случае, поэтому, когда я пишу свой код, есть ли какие-либо причины для написания кода StringBuilder в источнике? Обратите внимание, что мой вариант использования отличается от вопроса OP, поскольку я конкатенирую / добавляю сотни тысяч строк.

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


Ключевая фраза в вашем вопросе «предположительно медленнее». Вам нужно определить, действительно ли это узкое место, а затем посмотреть, что быстрее.

Если вы собираетесь написать этот код, но еще не написаны, напишите, что вам лучше, а затем, если это необходимо, посмотрите, является ли это узким местом.

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


Я думаю, что использование StringBuilder vs + действительно зависит от контекста, в котором вы его используете.

Как правило, с использованием JDK 1.6 и выше компилятор автоматически объединяет строки вместе с помощью StringBuilder .

String one = "abc";
String two = "xyz";
String three = one + two;

Это скомпилирует String three как:

String three = new StringBuilder().append(one).append(two).toString();

Это очень полезно и экономит время от времени. Однако этот процесс не всегда оптимален. Возьмем, к примеру:

String out = "";
for( int i = 0; i < 10000 ; i++ ) {
    out = out + i;
}
return out;

Если мы скомпилируем байт-код и затем декомпилируем генерируемый байт-код, мы получим что-то вроде:

String out = "";
for( int i = 0; i < 10000; i++ ) {
    out = new StringBuilder().append(out).append(i).toString();
}
return out;

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

StringBuilder out = new StringBuilder();
for( int i = 0 ; i < 10000; i++ ) {
    out.append(i);
}
return out.toString();

Теперь это более оптимально, чем код, сгенерированный компилятором, поэтому определенно необходимо написать код, используя классы StringBuilder / StringBuffer в случаях, когда необходим эффективный код. Текущие компиляторы не очень эффективны при конкатенации строк в цикле, однако это может измениться в будущем.

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

Примечание. Я скомпилировал код с помощью JDK 1.6 и декомпилировал код с помощью программы javap , которая выплевывает байт-код. Его довольно легко интерпретировать и часто полезно использовать при попытке оптимизировать код. Компилятор меняет ваш код за кулисами, поэтому всегда интересно посмотреть, что он делает!







stringbuilder