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