Raison pour laquelle le délai d'exécution ci-dessous des extraits de code diffèrent beaucoup?

Ashutosh Sharma:

Considérez les extraits de code ci-dessous et le temps nécessaire pour les exécuter -

 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");
}

Production -

Décalage horaire: 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");
}

Production -

Décalage horaire: 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");
}

Production -

Décalage horaire: 16secs

Selon ma compréhension, ce qui se passe à cause de chaque création d'objet de temps de Long objet, je ne sais pas comment cela se passe exactement. Essayé regardant dans le code octet n'a pas aidé beaucoup. Aidez-moi à comprendre exactement comment les choses se passent en interne?

Merci d'avance!

Ils étaient les suivants:

Les opérateurs « ++ » et « + = » ne sont définis que pour les primitives.

Par conséquent, lorsque vous les appliquez à un Long, un unboxing doit avoir lieu avant que l'opérateur est évalué, puis une boxe doit avoir lieu pour stocker le résultat.

La boxe coûte probablement plus que le unboxing, car unboxing nécessite juste un appel de méthode, alors que la boxe a besoin instanciation d'objets.

Chaque boxe implique la création d'une Longinstance. Votre boucle a Integer.MAX_VALUEitérations, de sorte que la seconde boucle crée plus de 2 milliards d' Longobjets (un pour chaque sum+=iopération) , tandis que la troisième boucle crée plus de 4 milliards d' Longobjets (une pour chaque i++opération et l' autre pour chaque sum+=iopération). Ces objets doivent être instancié et les déchets collectés plus tard. Cela coûte du temps.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=300687&siteId=1
conseillé
Classement