2011-12-31 8 views
9

Durante la lectura de 'ajuste del rendimiento de Java' de Jack Shirazi, me encontré con la siguiente declaración:variables estáticas/instance rendimiento de la operación de Java

"Instancia y variables estáticas pueden ser de hasta un orden de magnitud más lento para operar en cuando comparado con los argumentos del método y las variables locales ".

¿Sigue siendo aplicable a Java 6/7? Y si es así, ¿cuáles son las razones detrás de esto? (Explicó algo acerca de tener códigos de bytes especiales para acceder a variables/parámetros locales, pero yo no lo entendí).

Respuesta

9

Las palabras clave aquí son pueden ser. El problema es que los locals y params (que son esencialmente un gusto de los lugareños) pueden estar en registros, mientras que las variables de instancia y estáticas terminarán finalmente en la memoria (entrarían en los registros por el tiempo necesario para operarlos, pero finalmente, de vuelta a la memoria que van).

3

Incluso si el acceso fuera 10 veces más lento, solo importaría si estuviera en un bucle muy largo. Y el modelo de memoria de Java es bastante inteligente (a veces "demasiado" inteligente) para optimizar el acceso a la memoria a variables de instancia. Si utiliza una var de instancia en un bucle largo, por ejemplo, para sumar 100.000 dobles, es muy probable que la JVM optimice ese acceso y, de hecho, no escriba el resultado en la memoria cada vez. La excepción son los campos volátiles. De hecho, todo este problema de optimización es por qué hay campos volátiles.

Cuestiones relacionadas