¿Por qué las variables estáticas / miembro son más lentas que las variables locales?
He visto este hilo:Velocidad de si se compara con condicional
Hice mi propia clase para verificar la velocidad
public class Question {
static long startTime;
static long elapsedTime;
static String mStatic;
private String mPublic;
public static void main(String[] args) {
Question q = new Question();
q.executeGlobal();
q.executeStatic();
q.executeLocal();
}
public void executeLocal() {
String mLocal;
startTime = System.nanoTime();
for (int i = 0; i < 1000000000; i++) {
mLocal = "";
}
elapsedTime = System.nanoTime() - startTime;
System.out.println("Type Local: " + elapsedTime + " ns");
}
public void executeGlobal() {
startTime = System.nanoTime();
for (int i = 0; i < 1000000000; i++) {
mPublic = "";
}
elapsedTime = System.nanoTime() - startTime;
System.out.println("Type Global: " + elapsedTime + " ns");
}
public void executeStatic() {
startTime = System.nanoTime();
for (int i = 0; i < 1000000000; i++) {
mStatic = "";
}
elapsedTime = System.nanoTime() - startTime;
System.out.println("Type Static: " + elapsedTime + " ns");
}
}
Resultado:
Type Global: 45693028 ns
Type Static: 43853723 ns
Type Local: 2057505 ns
En la respuesta @Rod_algonquin respondió que se debe a laponerse estático/puttático bytecode para variable estática ygetfield/Putfield bytecode para la variable miembro, que está calculando a través del desplazamiento de bits y alguna adición.
Al principio pensé que soloObjetos causa esto, pero al intentar hacer referencia a primitivo el resultado es el mismolocal variable
es todavíaMás rápido.
¿Por qué esa variable local es más rápida? excepto la explicación del código de bytes.