ฉันใช้ Windows 8.1 x64 พร้อมอัปเดต Java 7 45 x64 (ไม่ได้ติดตั้ง Java 32 บิต) บนแท็บเล็ต Surface Pro 2
โค้ดด้านล่างใช้เวลา 1688ms เมื่อประเภทของ i ยาวและ 109ms เมื่อฉันเป็น int เหตุใดลำดับความยาว (ประเภท 64 บิต) จึงช้ากว่า int บนแพลตฟอร์ม 64 บิตที่มี JVM 64 บิต
การคาดเดาเพียงอย่างเดียวของฉันคือ CPU ใช้เวลาในการเพิ่มจำนวนเต็ม 64 บิตนานกว่า 32 บิตหนึ่ง แต่ดูเหมือนจะไม่น่าเป็นไปได้ ฉันสงสัยว่า Haswell ไม่ได้ใช้ตัวเติมแบบกระเพื่อม
ฉันกำลังเรียกใช้สิ่งนี้ใน 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;
}
}
แก้ไข: นี่คือผลลัพธ์จากโค้ด C ++ ที่เทียบเท่าซึ่งรวบรวมโดย VS 2013 (ด้านล่าง) ระบบเดียวกัน ยาว: 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 ไม่มีการเปลี่ยนแปลงที่สำคัญ
currentTimeMillis()
รันโค้ดที่สามารถปรับให้เหมาะสมได้อย่างสมบูรณ์และอื่น ๆ ทำให้เกิดผลลัพธ์ที่ไม่น่าเชื่อถือ