Я працюю на Windows 8.1 x64 з оновленням Java 7 45 x64 (32-розрядна Java не встановлена) на планшеті Surface Pro 2.
Наведений нижче код займає 1688 мс, якщо тип i довгий, і 109 мс, коли i - це int. Чому long (64-бітний тип) на порядок повільніший, ніж int, на 64-бітній платформі з 64-бітною JVM?
Моє єдине припущення - це те, що ЦП займає більше часу, щоб додати 64-бітове ціле число, ніж 32-бітове, але це здається малоймовірним. Я підозрюю, що Хасуел не використовує сумки для пульсацій.
Я запускаю це в 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 (нижче), тієї ж системи. довгий: 72265ms int: 74656ms Ці результати знаходились у 32-бітному режимі налагодження.
У 64-бітному режимі випуску: довгий: 875 мс довгий довгий: 906ms int: 1047ms
Це свідчить про те, що результатом, який я спостерігав, є дивацтво оптимізації 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()
, запуск коду, який можна тривіально повністю оптимізувати і т. Д., Відчуває ненадійні результати.