J'utilise Windows 8.1 x64 avec la mise à jour de Java 7 45 x64 (aucun Java 32 bits installé) sur une tablette Surface Pro 2.
Le code ci-dessous prend 1688 ms lorsque le type de i est long et 109 ms lorsque i est un int. Pourquoi long (un type 64 bits) est-il un ordre de grandeur plus lent que int sur une plate-forme 64 bits avec une JVM 64 bits?
Ma seule spéculation est que le processeur prend plus de temps pour ajouter un entier de 64 bits qu'un entier de 32 bits, mais cela semble peu probable. Je soupçonne que Haswell n'utilise pas d'additionneurs à effet d'entraînement.
J'exécute ceci dans Eclipse Kepler SR1, btw.
public class Main {
private static long i = Integer.MAX_VALUE;
public static void main(String[] args) {
System.out.println("Starting the loop");
long startTime = System.currentTimeMillis();
while(!decrementAndCheck()){
}
long endTime = System.currentTimeMillis();
System.out.println("Finished the loop in " + (endTime - startTime) + "ms");
}
private static boolean decrementAndCheck() {
return --i < 0;
}
}
Edit: Voici les résultats du code C ++ équivalent compilé par VS 2013 (ci-dessous), même système. long: 72265ms int: 74656ms Ces résultats étaient en mode débogage 32 bits.
En mode de libération 64 bits: longue: 875ms long long: 906ms int: 1047ms
Cela suggère que le résultat que j'ai observé est l'étrangeté de l'optimisation de la JVM plutôt que les limitations du processeur.
#include "stdafx.h"
#include "iostream"
#include "windows.h"
#include "limits.h"
long long i = INT_MAX;
using namespace std;
boolean decrementAndCheck() {
return --i < 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Starting the loop" << endl;
unsigned long startTime = GetTickCount64();
while (!decrementAndCheck()){
}
unsigned long endTime = GetTickCount64();
cout << "Finished the loop in " << (endTime - startTime) << "ms" << endl;
}
Edit: Je viens de réessayer dans Java 8 RTM, pas de changement significatif.
currentTimeMillis()
, exécuter du code qui peut être complètement optimisé de manière triviale, etc. sentent les résultats peu fiables.