NewInstance() против нового
Есть ли наказание за вызов newInstance() или это тот же самый механизм внизу?
Сколько накладных расходов, если они имеют newInstance(), над новым ключевым словом *?
*: дисконтирование того факта, что newInstance() подразумевает использование отражения.
Ответы
Ответ 1
В тесте реального мира, создавая 18129 экземпляров класса через "Constuctor.newInstance", передавая 10 аргументов -vs- создавая экземпляры через "новый", программа не имела заметной разницы во времени.
Это был не какой-то микро-тест.
Это с JDK 1.6.0_12 на бета-версии Windows 7 x86.
Учитывая, что Constructor.newInstance будет очень похож на Class.forName.newInstance, я бы сказал, что накладные расходы вряд ли имеют какую-либо функциональность, которую вы можете получить с помощью newInstance над новым.
Как всегда, вы должны сами проверить его.
Ответ 2
Будьте осторожны с микрообъектами, но я нашел эту запись в блоге, где кто-то обнаружил, что new
был примерно в два раза быстрее, чем newInstance
с JDK 1.4. Похоже, есть разница, и, как и ожидалось, отражение происходит медленнее. Тем не менее, похоже, что разница не может быть разрывом транзакций, в зависимости от частоты новых экземпляров объектов и количества вычислений.
Ответ 3
Там разница - в 10 раз. Абсолютная разница крошечная, но если ваше записывающее приложение с низкой задержкой суммарное потерянное время CPU может быть значительным.
long start, end;
int X = 10000000;
ArrayList l = new ArrayList(X);
start = System.nanoTime();
for(int i = 0; i < X; i++){
String.class.newInstance();
}
end = System.nanoTime();
log("T: ", (end - start)/X);
l.clear();
start = System.nanoTime();
for(int i = 0; i < X; i++){
new String();
}
end = System.nanoTime();
log("T: ", (end - start)/X);
Вывод:
T: 105
T: 11
Протестировано на Xeon W3565 @3.2Ghz, Java 1.6