Главная » Java, Советы » При конкатенации строк опасайтесь потери производительности

0

 

Оператор конкатенации строк (+) – удобный способ объединения нескольких строк в одну. Он превосходно справляется с генерацией отдельной строки для вывода и с созданием строкового представления для небольшого объекта с фиксированным размером, но не допускает масштабирования. Время, которое необходимо оператору конкатенации для последовательного объединения строк, пропорционально квадрату числа n. К сожалению, это следствие того факта, что строки являются неизменяемыми (статья 13). При объединении двух строк копируется содержимое обеих строк.

Например, рассмотрим метод, который создает строковое представление для выписываемого счета, последовательно объединяя строки для каждого пункта в счете:

 

// Неуместное объединение строк – плохая производительность

public String statement() {

String s = “ ” ;

for (int i = 0; i < numItems(); i++)

           s += lineForItem(i);            // Объединение строк

return s;

 

Если количество пунктов велико, этот метод работает очень медленно. Чтобы добиться приемлемой производительности, создаваемое представление счета должно храниться в классе StringBuffer, а не String:

 

public String statement() {

StringBuffer s = new StringBuffer(numItems() * LINE_WIDTH);

for (int i = 0; i < numItems(); i++)

s.append(lineForItem(i));

return s.toString();

 

Изменение производительности впечатляет. Если число пунктов (nиmItems) равно 100, а длина строки (lineForItem) постоянна.и равна 80, то на моей машине второй метод работает в девяносто раз быстрее первого. Поскольку первый метод демонстрирует квадратичную зависимость от количества пунктов, а второй – линейную, разница в производительности при большем количестве пунктов становится еще более разительной. Заметим, что второй метод начинается с предварительного размещения в памяти объекта StringBuffer, достаточно крупного, чтобы в нем поместился результат вычислений. Даже если отказаться от этого и создать StringBuffer, имеющий размер по умолчанию, он будет работать в сорок пять раз быстрее, чем первый метод.

 

 

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

 

Источник: Джошуа Блох, Java TM Эффективное программирование, Издательство «Лори»

По теме:

  • Комментарии