Я использую Windows 8.1 x64 с обновлением Java 7 45 x64 (без 32-разрядной Java-установки) на планшете Surface Pro 2.
Ниже приведен код 1688 мс, когда тип я длинный и 109 мс, когда я является int. Почему длинный (64-разрядный тип) на порядок медленнее, чем int на 64-битной платформе с 64-битным JVM?
Мое единственное предположение заключается в том, что процессор занимает больше времени, чтобы добавить 64-битное целое число, нежели 32-битное, но это кажется маловероятным. Я подозреваю, что Хасуэлл не использует рябителей.
Я запускаю это в 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;
}
}
Изменить: Вот результаты от эквивалентного кода на С++, составленного VS 2013 (см. ниже), в той же системе. long: 72265ms int: 74656ms Эти результаты были в режиме 32-разрядного отладки.
В режиме 64-разрядной версии: long: 875 мс длинный: 906 мс int: 1047мс
Это говорит о том, что результат, который я наблюдал, - это оптимизация JVM, а не ограничения ЦП.
#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;
}
Изменить: просто попробовал это снова в RTM Java 8, никаких существенных изменений.