Surface Pro 2 タブレットで Windows 8.1 x64 と Java 7 update 45 x64 (32 ビット Java はインストールされていません) を実行しています。
以下のコードは、i の型が long の場合は 1688 ミリ秒、i が int の場合は 109 ミリ秒かかります。64 ビット JVM を使用した 64 ビット プラットフォームで long (64 ビット型) が int よりも桁違いに遅いのはなぜですか?
私の唯一の憶測は、CPU が 32 ビット整数よりも 64 ビット整数を追加するのに時間がかかるということですが、それはありそうにないようです。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;
}
}
編集: これは、VS 2013 (以下)、同じシステムによってコンパイルされた同等の C++ コードの結果です。long: 72265ms int: 74656ms これらの結果は、デバッグ 32 ビット モードでのものでした。
64 ビット リリース モードの場合:長い: 875mslong long: 906ms int: 1047ms
これは、私が観察した結果が、CPU の制限ではなく、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でこれをもう一度試しましたが、大きな変化はありません。