Я запускаю Windows 8.1 x64 с обновлением Java 7 45 x64 (без 32-разрядной Java-установки) на планшете Surface Pro 2.Почему медленнее, чем int в x64 Java?
Код ниже принимает 1688 мс, когда тип i является длинным и 109 мс, когда i является int. Почему длинный (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 (ниже), той же системы. long: 72265ms int: 74656ms Эти результаты были в режиме 32-разрядного отладки.
В режиме выпуска 64 бит: долго: 875ms длинные длинные: 906ms INT: 1047ms
Это говорит о том, что результат Я наблюдал это JVM, оптимизация странность, а не ограничения 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;
}
Редактировать: Просто попробовал это снова в Java 8 RTM, никаких существенных изменений.
Наиболее вероятный подозреваемый - это ваша настройка, а не центральный процессор или различные части JVM. Можете ли вы надежно воспроизвести это измерение? Не повторяя цикл, не разогревая JIT, используя 'currentTimeMillis()', запускающий код, который можно тривиально полностью оптимизировать и т. Д., Наносит ненадежный результат. – delnan
Я сравнивал некоторое время назад, мне пришлось использовать 'long' в качестве счетчика циклов, потому что компилятор JIT оптимизировал цикл, когда я использовал' int'. Нужно будет посмотреть на разборку сгенерированного машинного кода. – Sam
@ ZongZhengLi Да, результат вполне повторяемый. – Techrocket9