Производительность статических переменных / переменных экземпляра Java - PullRequest
9 голосов
/ 31 декабря 2011

Читая «Настройка производительности Java» Джека Ширази, я наткнулся на следующее утверждение:

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

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

Ответы [ 2 ]

9 голосов
/ 31 декабря 2011

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

3 голосов
/ 31 декабря 2011

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

...