Я проводил тесты с Java StringBuilder, особенно с функцией replace(int, int, String), которая реализована в классе AbstractStringBuilder следующим образом:
public AbstractStringBuilder replace(int start, int end, String str) {
if (start < 0)
throw new StringIndexOutOfBoundsException(start);
if (start > count)
throw new StringIndexOutOfBoundsException("start > length()");
if (start > end)
throw new StringIndexOutOfBoundsException("start > end");
if (end > count)
end = count;
int len = str.length();
int newCount = count + len - (end - start);
if (newCount > value.length)
expandCapacity(newCount);
System.arraycopy(value, end, value, start + len, count - end);
str.getChars(value, start);
count = newCount;
return this;
}
Вызов функции Arraycopy «перемещает» части содержимого массива символов значения, чтобы освободить место для введенного позже содержимого str (str.getChars(value, start)). С моей точки зрения, эту копию массива следует делать только в том случае, если длина строки в любом случае не соответствует пространству, которое должно быть перезаписано в массиве символов.
Ясно, что кто-то очень отчаянно пытается рассматривать это как проблему с производительностью, хотя выполнение тестов с большими массивами символов (>500 тыс. символов) и копированием массива в замещающем классе StringBuilder привело к заметному улучшению производительности.
Протестировано с java 6 на 32-битной платформе Windows с тем же экземпляром StringBuilder для нескольких миллионов вызовов замены.
Считаете ли вы это неважным, ошибкой или я что-то полностью упускаю?
arraycopy
в любом случае достаточно умен, чтобы избежать ненужной работы; единственное улучшение производительности будет происходить за счет исключения проверки, необходимой для определения того, что работа не нужна. Я думаю, что вы правы, на самом деле. - person Ernest Friedman-Hill   schedule 08.03.2012