Beholder
@Beholder

Почему StringBuilder.setLength(0) медленнее чем ожидается?

Прочитал статью Clearing a StringBuilder or StringBuffer и сначала не поверил, но проверил сам - и это действительно так. StringBuilder.setLength(0) чуть ли не в два раза медленнее, чем StringBuilder.delete(0, sb.length()). Проверил на Open JDK 17. Отчего так? setLength(0) же никаких массивов на самом деле не обнуляет, а только устанавливает счётчик.
  • Вопрос задан
  • 122 просмотра
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
А как вы измеряли? Методика бенчмарков в Java - нетривиальна. Тут надо попасть в прогретый код и в промежутки между паузами GC. Иначе ваш эскперимент будет выдавать вовсе не то время что вы хотите мерять.
Ответ написан
Sputterspark
@Sputterspark
А ты посмотри исходный код обоих методов и сразу всё станет понятно. Метод delete вызывает написанную на C функцию arraycopy, которая с параметрами передаваемыми в неё при аргументах 0 и sb.length не делает ничего и сразу возвращает управление. Метод setLength сначала делает вызов другого метода ensureCapacityInternal, который проверяет текущую длину массива, и только потом устанавливает новый размер. Во втором случае тупо больше вызовов и каждый из них медленнее, чем arraycopy с нулевым параметром length.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы