2009-06-22 3 views
0

Есть ли разница в производительности между этими двумя частями кода? Я чувствую, что второй вариант медленнее, поскольку объект Cell нужно строить каждый раз, но мне нравится идея вернуть Cell.Есть ли разница в производительности между этими двумя частями кода?

Вариант один:

//Call to method 
initiTextDefaultCell(borders); 
iTextTable.setDefaultCell(iTextDefaultCell); 
//Other code... 

private void initiTextDefaultCell(boolean borders) { 
    if (!borders) 
    iTextDefaultCell.setBorder(Rectangle.NO_BORDER); 
    else 
    iTextDefaultCell.setBorder(Rectangle.BOX); 
} 

Вариант второй:

//Call to method 
iTextTable.setDefaultCell(initiTextDefaultCell(borders)); 
//Other code... 

private Cell initiTextDefaultCell(boolean borders) { 
    Cell iTextDefaultCell = new Cell(); 
    if (!borders) 
    iTextDefaultCell.setBorder(Rectangle.NO_BORDER); 
    else 
    iTextDefaultCell.setBorder(Rectangle.BOX); 
    return iTextDefaultCell; 
} 

Спасибо!

+4

Это не похоже на код, который вы вызываете в узкой петле. Вы видите проблему с производительностью, которая требует оптимизации этой функции? –

+0

Связано ли это с iText PDF-генератором? – akarnokd

ответ

4

Как вы сказали, опция 2 будет медленнее из-за выделения нового объекта.

Это выглядит как решение с четкостью и эффективностью. Я лично считаю, что вариант второй более ясен и что влияние на производительность будет незначительным.

Однако, не зная, что iTextTable трудно сказать наверняка, что использовать. Если initiTextDefaultCell вызывается один раз при создании экземпляра таблицы, то я бы пошел с опцией два, однако, если вызывается количество раз initiTextDefaultCell, зависит от размера таблицы, тогда вариант один был бы лучше (если предположить, что ячейка по умолчанию была создана как часть экземпляра iTextTable).

18

Запишите тестовую программу и убедитесь сами.

2

Второй (возможно) более медленный (но см. Комментарий Мнемента). Он делает все, что делает первый, и многое другое. Но это не значит, что вы не должны использовать его, если считаете, что это лучший дизайн (и я склонен согласиться). Как сказал Лу, это, вероятно, не ваше узкое место. Если вам нужно точно знать, тест.

+2

Не будьте так уверены. Первый - это тот же код, с созданием переменной iTextDefaultCell, отсутствующей в фрагменте (но это явно необходимо для запуска кода). Таким образом, оба варианта выполняют одни и те же команды, но отличаются друг от друга структурированными. Основное отличие состоит в том, что первый вариант использует переменную, которая может быть видна методом. Второй вместо этого сам создает этот объект и возвращает его. Возможно, в любом случае он будет оптимизирован для того же самого кода. Но никто не может сказать, не проверив его. – Mnementh

+0

Вы предполагаете, что iTextDefaultCell нужно создать только для варианта 1. Создание не показано ни для одного, поэтому разумно думать, что это необходимо в любом случае (возможно, позже). –

3

hmmm ... который медленнее, 10 мс или 1 мс?

Вариант 2 будет медленнее, чем вариант 1, да, но даже если разница может быть фактором 10, даже этот «высокий» коэффициент, когда медленная версия достаточно быстро не будет замечена человеком (цифры используются только в качестве примеров).

Первое правило эффективности - только оптимизировать, когда вам нужно. Второе правило производительности - хорошо спроектированная система, как правило, имеет хорошую производительность, и при необходимости ее проще оптимизировать.

Вариант 2 намного читабельнее и имеет лучший дизайн. Это связано с тем, что метод создает Cell, который также настраивает его.

Смежные вопросы