2010-09-30 17 views
7

Recientemente me encontré con una clase que tenía el siguiente campo declaradas:diferencias de rendimiento entre los campos primitivos finales estáticos y no estáticos en Java

private final int period = 1000; 

En este caso particular, el autor tenía la intención de que sea también estático y dado que el valor no podía ser alterado en ningún momento, no había una razón funcional real para no declararlo estático, pero me hizo preguntarme cómo trata Java las primitivas estáticas finales vs. finales.

En particular:

1) ¿Cómo se almacenan los primitivos estáticas finales? ¿Están simplemente compilados directamente en las expresiones en las que se usan?

2) Si realmente se les asigna almacenamiento, ¿cada instancia de la clase contenedora debe mantener una referencia a esa ubicación? (en cuyo caso, para primitivas de menos de 4 bytes, cada instancia de la clase sería más grande que si simplemente incluyera la primitiva directamente como lo haría en el caso no estático)

3) ¿Son ahora los compiladores inteligentes? suficiente para determinar que en casos como el anterior, la variable es 'efectivamente estática' ya que sería imposible tener instancias diferentes que contengan valores diferentes y por lo tanto optimizarla de manera similar a una estática final?

Respuesta

5

1) ¿Cómo se almacenan las primitivas estáticas finales? ¿Están simplemente compilados directamente en las expresiones en las que se usan?

No compilado directamente en las expresiones. Se compilan en el archivo .class y se mencionan en el código de operación ldc.

2) Si realmente se les asigna almacenamiento, ¿cada instancia de la clase contenedora debe mantener una referencia a esa ubicación? (En cuyo caso, por las primitivas de menos de 4 bytes, cada instancia de la clase en realidad sería más grande que si simplemente incluía la primitiva directamente como lo haría en el caso no estático)

No, la " la referencia "se hornea en el bytecode, por lo que no es necesario almacenar nada por instancia.

3) Los compiladores ahora son lo suficientemente inteligentes como para determinar que en casos como el anterior, la variable es 'efectivamente estática' ya que sería imposible tener instancias diferentes que contengan valores diferentes y por lo tanto optimizarlo de manera similar ¿estático final?

No estoy seguro, pero dudo que esté optimizado en el nivel del compilador. El JIT probablemente entraría en juego. Sin embargo, no estoy del todo seguro de qué tipo de "diferencias de rendimiento" está esperando. No importa cuál sea el caso, el impacto en el rendimiento será insignificante. (estático/no estático/final/no final)

+0

Re: n. ° 3, en realidad no esperaba diferencias de rendimiento en cuanto a la velocidad, pero no sabía si mi optimización no la almacenaba por instancia. a la actual campos estáticos finales. En retrospectiva, la diferencia de rendimiento es probablemente un nombre inapropiado. Gracias por la aclaración – Dusty

Cuestiones relacionadas