Уже хороший ответ там. Просто добавьте результат для теста производительности StringBuffer и StringBuild, используйте новый экземпляр в цикле или используйте setLength (0) в цикле.
Резюме: в большой петле
- StringBuilder намного быстрее, чем StringBuffer
- Создание нового экземпляра StringBuilder в цикле не имеет
разница с setLength (0). (setLength (0) имеет очень очень маленькое преимущество перед созданием нового экземпляра.)
- StringBuffer медленнее, чем StringBuilder, благодаря созданию нового экземпляра в цикле
- setLength (0) из StringBuffer чрезвычайно медленнее, чем создание нового экземпляра в цикле.
Очень простой тест (я просто вручную изменил код и провёл другой тест):
public class StringBuilderSpeed {
public static final char ch[] = new char[]{'a','b','c','d','e','f','g','h','i'};
public static void main(String a[]){
int loopTime = 99999999;
long startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < loopTime; i++){
for(char c : ch){
sb.append(c);
}
sb.setLength(0);
}
long endTime = System.currentTimeMillis();
System.out.println("Time cost: " + (endTime - startTime));
}
}
Новый экземпляр StringBuilder в цикле:
Стоимость времени: 3693, 3862, 3624, 3742
StringBuilder setLength:
Стоимость времени: 3465, 3421, 3557, 3408
Новый экземпляр StringBuffer в цикле:
Стоимость времени: 8327, 8324, 8284
StringBuffer setLength
Стоимость времени: 22878, 23017, 22894
Снова StringBuilder setLength, чтобы убедиться, что у моего labtop нет проблем с таким длинным использованием StringBuffer setLength :-)
Стоимость времени: 3448