2011-12-31 3 views
9

Во время чтения «настройки производительности Java» Джек Ширази, я наткнулся на следующее утверждение:статические/переменные экземпляра производительности работы в Java

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

Это все еще применимо к Java 6/7? И если да, то в чем причины этого? (Он объяснил кое-что о наличии специальных байткодов для доступа к локальным переменным/параметрам, но я этого не понял).

ответ

9

Ключевыми словами здесь являются может быть. Проблема заключается в том, что локали и параметры (которые по существу являются ароматом местных жителей) могут содержать в регистре, тогда как экземпляры и статические переменные в конечном итоге окажутся в памяти (они попадут в регистры на время, необходимое для работы на них, но в конце концов, обратно в память они идут).

3

Даже если доступ был в 10 раз медленнее, это имело бы значение только в том случае, если вы были в очень длинном цикле. И модель памяти Java довольно умна (иногда «слишком» умна) об оптимизации доступа к памяти к переменным экземпляра. Если вы используете экземпляр var в длинном цикле, скажем, чтобы суммировать 100 000 удвоений, JVM, скорее всего, оптимизирует этот доступ, и, фактически, не записывает результат в память каждый раз. Исключение составляют изменчивые поля. Фактически, вся эта проблема оптимизации связана с тем, что существуют изменчивые поля.

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