我在 Surface Pro 2平板电脑上运行 Windows 8.1 x64,Java 7更新为45 x64(没有安装32位 Java)。
下面的代码需要1688ms 当 i 的类型是一个长的和109ms 当 i 是一个整型。为什么 long (64位类型)在64位 JVM 平台上的数量级比 int 慢?
我唯一的猜测是,CPU 添加一个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;
}
}
编辑: 下面是 VS2013(下面)编译的相同 C + + 代码的结果,同一个系统。这些结果处于调试32位模式。
在64位释放模式: 长: 875毫米长: 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;
}
编辑: 刚刚在 Java8RTM 中再次尝试,没有显著变化。