He estado mirando algunas de las colecciones primitivas de java (trove, fastutil, hppc) y he notado un patrón de que las variables de clase a veces se declaran como variables locales final
. Por ejemplo:¿Es más rápido acceder a las variables locales finales que las variables de clase en Java?
public void forEach(IntIntProcedure p) {
final boolean[] used = this.used;
final int[] key = this.key;
final int[] value = this.value;
for (int i = 0; i < used.length; i++) {
if (used[i]) {
p.apply(key[i],value[i]);
}
}
}
que he hecho alguna evaluación comparativa, y parece que es un poco más rápido cuando se hace esto, pero ¿por qué es este el caso? Intento entender qué haría Java de manera diferente si las primeras tres líneas de la función estuvieran comentadas.
Nota: Esto parece ser similar a this question, pero eso fue para C++ y no aborda por qué se declaran final
.
se puede tratar de buscar en el conjunto de Java generado para ver la diferencia. –
acaba de darse cuenta de que la razón puede estar en el compilador de HotSpot, no en el código de bytes ... –
Publique su código de evaluación comparativa, hay al menos alguna posibilidad de que haya evaluado el método erróneamente y realmente haya probado solo el intérprete y no el compilador :) – Voo