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