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!
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 Long
instance. Votre boucle a Integer.MAX_VALUE
itérations, de sorte que la seconde boucle crée plus de 2 milliards d' Long
objets (un pour chaque sum+=i
opération) , tandis que la troisième boucle crée plus de 4 milliards d' Long
objets (une pour chaque i++
opération et l' autre pour chaque sum+=i
opération). Ces objets doivent être instancié et les déchets collectés plus tard. Cela coûte du temps.