J'ai les deux programmes:vitesse Iteration de int vs longue
long startTime = System.currentTimeMillis();
for (int i = 0; i < N; i++);
long endTime = System.currentTimeMillis();
System.out.println("Elapsed time: " + (endTime - startTime) + " msecs");
et
long startTime = System.currentTimeMillis();
for (long i = 0; i < N; i++);
long endTime = System.currentTimeMillis();
System.out.println("Elapsed time: " + (endTime - startTime) + " msecs");
Note: la seule différence est le type de la variable de boucle (int
et long
).
Lorsque j'exécute cela, le premier programme imprime systématiquement entre 0 et 16 ms, indépendamment de la valeur de N
. La seconde prend beaucoup plus de temps. Pour N == Integer.MAX_VALUE
, il fonctionne à environ 1800 msecs sur ma machine. La durée d'exécution semble être plus ou moins linéaire dans N
.
Alors pourquoi est-ce?
Je suppose que le compilateur JIT optimise la boucle int
à la mort. Et pour cause, car évidemment, ça ne fait rien. Mais pourquoi ne le fait-il pas aussi pour la boucle long
? Un collègue a pensé que nous pourrions mesurer le compilateur JIT en train de faire son travail dans la boucle long
, mais comme le temps d'exécution semble être linéaire dans N
, ce n'est probablement pas le cas.
J'utilise JDK 1.6.0 update 17:
C:\>java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)
Je suis sous Windows XP Professionnel Édition x64 Service Pack 2, avec un processeur Intel Core2 Quad CPU à 2,40 GHz.
AVERTISSEMENT
Je sais que microbenchmarks ne sont pas utiles dans la production. Je sais aussi que System.currentTimeMillis()
n'est pas aussi précis que son nom l'indique. C'est juste quelque chose que j'ai remarqué en flânant, et j'étais simplement curieux de savoir pourquoi cela se produit; rien de plus.
Je suis absolument d'accord avec @Andrzej ici, mais si elle est vraiment juste pour l'amour de la curiosité, vous pouvez utiliser le plugin PrintAssembly pour vraiment regarder le code généré: http://wikis.sun.com/display/HotSpotInternals/PrintAssembly –
Que se passe-t-il si vous utilisez le drapeau -Xint? Cela empêche la compilation de Hotspot, donc vous obtiendrez une meilleure comparaison. –
@Steven: mais avec '-Xint' le résultat est * encore moins * significatif pour tout ce qui ressemble à un usage réel. –