Tenga en cuenta los siguientes fragmentos de código y el tiempo necesario para ejecutarlos -
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
long sum = 0L;
for(int i = 0; i< Integer.MAX_VALUE; i++){
sum+=i;
}
Long timeDiff = (System.currentTimeMillis() - startTime) / 1000;
System.out.println("Time Difference : " + timeDiff + "secs");
}
salida -
Diferencia horaria: 0secs
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
Long sum = 0L;
for(int i = 0; i< Integer.MAX_VALUE; i++){
sum+=i;
}
Long timeDiff = (System.currentTimeMillis() - startTime) / 1000;
System.out.println("Time Difference : " + timeDiff + "secs");
}
salida -
Diferencia horaria: 8secs
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
Long sum = 0L;
for(Long i = 0L; i< Integer.MAX_VALUE; i++){
sum+=i;
}
Long timeDiff = (System.currentTimeMillis() - startTime) / 1000;
System.out.println("Time Difference : " + timeDiff + "secs");
}
salida -
Diferencia horaria: 16secs
Según mi entendimiento, que está sucediendo debido a la creación de objetos cada vez de Long objeto, no estoy seguro de cómo exactamente esto está sucediendo. Intentado buscar en el código de bytes no ayuda mucho. Me ayudan a entender exactamente cómo las cosas están sucediendo internamente?
¡Gracias por adelantado!
Los operadores "++" y "+ =" Sólo se definen para primitivas.
Por lo tanto, cuando se las aplica a una Long
, un unboxing debe tener lugar antes de evaluar el operador y luego un combate de boxeo debe tener lugar para almacenar el resultado.
El boxeo, probablemente, cuesta más que el unboxing, ya unboxing requiere sólo una llamada a un método, mientras que el boxeo requiere instancias de objetos.
Cada boxeo implica la creación de una Long
instancia. Su bucle tiene Integer.MAX_VALUE
iteraciones, por lo que el segundo bucle crea más de 2 mil millones Long
objetos (uno por cada sum+=i
operación), mientras que el tercer bucle crea más de 4 mil millones Long
objetos (uno para cada i++
operación y uno para cada sum+=i
operación). Estos objetos tienen que ser instanciado y más tarde basura recogida. Eso cuesta tiempo.