Używam systemu Windows 8.1 x64 z aktualizacją Java 7 45 x64 (bez zainstalowanej 32-bitowej wersji Java) na tablecie Surface Pro 2.
Poniższy kod zajmuje 1688 ms, gdy typ i jest długi i 109 ms, gdy i jest int. Dlaczego long (typ 64-bitowy) jest o rząd wielkości wolniejszy niż int na platformie 64-bitowej z 64-bitową maszyną JVM?
Moje jedyne spekulacje są takie, że procesorowi zajmuje więcej czasu, aby dodać 64-bitową liczbę całkowitą niż 32-bitową, ale wydaje się to mało prawdopodobne. Podejrzewam, że Haswell nie używa dodatków przenoszących tętnienia.
Przy okazji uruchamiam to w Eclipse Kepler SR1.
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;
}
}
Edycja: Oto wyniki równoważnego kodu C ++ skompilowanego przez VS 2013 (poniżej), ten sam system. długi: 72265 ms int: 74656 ms Te wyniki były w 32-bitowym trybie debugowania.
W trybie wersji 64-bitowej: długi: 875 ms długi długi: 906 ms int: 1047 ms
Sugeruje to, że wynikiem, który zaobserwowałem, jest raczej dziwność optymalizacji JVM niż ograniczenia procesora.
#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;
}
Edycja: próbowałem tego ponownie w Java 8 RTM, bez znaczącej zmiany.
currentTimeMillis()
uruchomionego kodu, który w trywialny sposób można całkowicie zoptymalizować itp. Cuchnie niewiarygodnymi wynikami.