Surface Pro 2 tablette Java 7 güncelleme 45 x64 (32 bit Java yüklü değil) ile Windows 8.1 x64 çalıştırıyorum.
Aşağıdaki kod, i türü uzun olduğunda 1688 ms ve i bir int olduğunda 109 ms sürer. Neden uzun (64 bit tip) 64 bitlik bir JVM ile 64 bit platformda int'den daha büyük bir sıra daha yavaştır?
Tek spekülasyonum, CPU'nun 64 bitlik bir tamsayı eklemesinin 32 bit olandan daha uzun sürmesi, ancak bu pek olası görünmüyor. Haswell'in dalgalanma taşıma toplayıcıları kullanmadığından şüpheleniyorum.
Bunu Eclipse Kepler SR1, btw'de çalıştırıyorum.
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;
}
}
Düzenleme: İşte VS 2013 (aşağıda), aynı sistem tarafından derlenen eşdeğer C ++ kodunun sonuçları. uzun: 72265ms int: 74656ms Bu sonuçlar 32 bitlik hata ayıklama modundaydı.
64 bit bırakma modunda: uzun: 875 ms uzun uzun: 906ms int: 1047ms
Bu, gözlemlediğim sonucun CPU sınırlamalarından ziyade JVM optimizasyonu tuhaflığı olduğunu gösteriyor.
#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;
}
Düzenleme: Bunu Java 8 RTM'de tekrar denedim, önemli bir değişiklik yok.
currentTimeMillis()
, JIT'i ısıtmamak, tamamen optimize edilebilen kodu kullanmak , çalıştırmak vb. Güvenilmez sonuçlar doğurur.