Подтвердить что ты не робот

NewInstance() против нового

Есть ли наказание за вызов newInstance() или это тот же самый механизм внизу? Сколько накладных расходов, если они имеют newInstance(), над новым ключевым словом *?

*: дисконтирование того факта, что newInstance() подразумевает использование отражения.

4b9b3361

Ответ 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