Tôi đang chạy Windows 8.1 x64 với bản cập nhật Java 7 45 x64 (không cài đặt Java 32 bit) trên máy tính bảng Surface Pro 2.
Đoạn mã dưới đây mất 1688ms khi loại i là dài và 109ms khi i là int. Tại sao long (loại 64 bit) là thứ tự cường độ chậm hơn int trên nền tảng 64 bit với JVM 64 bit?
Suy đoán duy nhất của tôi là CPU mất nhiều thời gian hơn để thêm số nguyên 64 bit so với số nguyên 32 bit, nhưng điều đó có vẻ khó xảy ra. Tôi nghi ngờ Haswell không sử dụng các trình bổ sung ripple-carry.
Tôi đang chạy điều này trong 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;
}
}
Chỉnh sửa: Đây là kết quả từ mã C ++ tương đương được biên dịch bởi VS 2013 (bên dưới), cùng một hệ thống. dài: 72265ms int: 74656ms Các kết quả đó ở chế độ 32 bit gỡ lỗi.
Trong chế độ phát hành 64 bit: dài: 875ms long long: 906ms int: 1047ms
Điều này cho thấy rằng kết quả mà tôi quan sát được là sự kỳ lạ khi tối ưu hóa JVM chứ không phải là các hạn chế của 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;
}
Chỉnh sửa: Chỉ cần thử lại điều này trong Java 8 RTM, không có thay đổi đáng kể.
currentTimeMillis()
, chạy mã có thể được tối ưu hóa hoàn toàn một cách tầm thường, v.v. hàng loạt kết quả không đáng tin cậy.