Utilizzo Windows 8.1 x64 con aggiornamento Java 7 45 x64 (non è installato Java a 32 bit) su un tablet Surface Pro 2.
Il codice seguente richiede 1688 ms quando il tipo di i è lungo e 109 ms quando i è un int. Perché long (un tipo a 64 bit) è un ordine di grandezza più lento di int su una piattaforma a 64 bit con una JVM a 64 bit?
La mia unica ipotesi è che la CPU impiega più tempo per aggiungere un numero intero a 64 bit rispetto a uno a 32 bit, ma sembra improbabile. Ho il sospetto che Haswell non usi sommatori per il trasporto di ondulazioni.
Sto eseguendo questo in 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;
}
}
Modifica: ecco i risultati del codice C ++ equivalente compilato da VS 2013 (sotto), stesso sistema. lungo: 72265 ms int: 74656 ms Questi risultati erano in modalità di debug a 32 bit.
In modalità di rilascio a 64 bit: lungo: 875 ms lungo lungo: 906 ms int: 1047 ms
Ciò suggerisce che il risultato che ho osservato è la stranezza dell'ottimizzazione JVM piuttosto che i limiti della CPU.
#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;
}
Modifica: ho appena provato di nuovo in Java 8 RTM, nessun cambiamento significativo.
currentTimeMillis()
, eseguire codice che può essere banalmente ottimizzato completamente, ecc. Puzza di risultati inaffidabili.