Saya menjalankan Windows 8.1 x64 dengan pembaruan Java 7 45 x64 (tidak ada Java 32 bit yang diinstal) di tablet Surface Pro 2.
Kode di bawah ini membutuhkan waktu 1688ms ketika tipe i adalah panjang dan 109ms ketika i adalah sebuah int. Mengapa long (tipe 64 bit) urutan besarnya lebih lambat daripada int pada platform 64 bit dengan 64 bit JVM?
Satu-satunya spekulasi saya adalah bahwa CPU membutuhkan waktu lebih lama untuk menambahkan integer 64 bit daripada yang 32 bit, tetapi itu tampaknya tidak mungkin. Saya menduga Haswell tidak menggunakan penambah ripple-carry.
Saya menjalankan ini di Eclipse Kepler SR1, btw.
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;
}
}
Sunting: Berikut adalah hasil dari kode C ++ setara yang dikompilasi oleh VS 2013 (di bawah), sistem yang sama. panjang: 72265ms int: 74656ms Hasil tersebut dalam mode debug 32 bit.
Dalam mode rilis 64 bit: panjang: 875ms panjang panjang: 906ms int: 1047ms
Ini menunjukkan bahwa hasil yang saya amati adalah keanehan pengoptimalan JVM daripada batasan 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;
}
Edit: Coba ini lagi di Java 8 RTM, tidak ada perubahan signifikan.
currentTimeMillis()
, menjalankan kode yang dapat dengan mudah dioptimalkan sepenuhnya, dll. Berbau hasil yang tidak dapat diandalkan.