2013-10-08 5 views
9

В этой дискуссии об эффективности накладных расходов использования reflection, говорится:Какие во время выполнения оптимизаций теряются, если мы используем отражение

Использование отражения может привести к некоторым времени выполнения оптимизаций, которые будут потеряны. Например, следующий код весьма вероятно, будет оптимизирован с помощью виртуальной машины Java:

int x = 1; 
x = 2; 
x = 3; 

Эквивалентного код с использованием Field.set *() не может.

Без отражения, какая оптимизация времени выполнения будет выполнена JVM?

+0

Он просто запускает 'x = 3'. Всевозможные интригующие трюки, устранение кода операции и т. Д. Исчезают, когда вы бросаете отражение в микс. –

+0

Это интересный вопрос, но я думаю, что он слишком широк для одного вопроса SO. – chrylis

+0

Назначения x ничего не делают. Это локальная переменная, не многопотоковая, без параллелизма и может быть удалена. Если вы используете Field.set, другой поток может иметь доступ к переменной, поэтому его никогда нельзя оптимизировать. Вот что я думаю. –

ответ

0

Невозможно сделать много оптимизаций JIT. Просто загляните в источник JDK, установив значение поля через отражение, включающее проверки безопасности и некоторые поисковые запросы.

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

Если вы проверите это, вы обнаружите, что отражение на порядок медленнее по сравнению с «прямым» кодом.

+1

Можете ли вы подробно остановиться на своей последней строке? Как вы пришли к выводу «порядка величины»? – Victor

+0

Отражение может быть почти таким же быстрым, как прямой код, в зависимости от того, что вы делаете и как вы это делаете. В частности, проверки безопасности и т. Д. Влияют только на первый доступ ... – assylias

+0

Просто проверьте это. (1) запускайте приличную разминку (> 10000 итераций), так что JIT срабатывает. Избегайте ошибочного заблуждения. –

3

В этом случае код может быть отброшен, поскольку он ничего не делает.

Если вы использовали отражение, я подозреваю, что он все равно сделает что-то, хотя вы не можете получить доступ к локальной переменной, используя отражение.

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