Por lo que el tiempo necesario para ejecutar a continuación fragmentos de código difieren mucho?

Ashutosh Sharma:

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!

Eran :

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 Longinstancia. Su bucle tiene Integer.MAX_VALUEiteraciones, por lo que el segundo bucle crea más de 2 mil millones Longobjetos (uno por cada sum+=ioperación), mientras que el tercer bucle crea más de 4 mil millones Longobjetos (uno para cada i++operación y uno para cada sum+=ioperación). Estos objetos tienen que ser instanciado y más tarde basura recogida. Eso cuesta tiempo.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=300690&siteId=1
Recomendado
Clasificación