আমি একটি সারফেস প্রো 2 ট্যাবলেটে জাভা 7 আপডেট 45 x64 (32 বিট জাভা ইনস্টল করা নেই) সহ উইন্ডোজ 8.1 x64 চালাচ্ছি।
নীচের কোডটিতে 1688ms লাগে যখন i টাইপ দীর্ঘ হয় এবং 109ms যখন আমি কোন int হয় int লম্বা (একটি bit৪ বিটের ধরণের) একটি bit৪ বিট জেভিএম সহ একটি bit৪ বিট প্ল্যাটফর্মের চেয়ে প্রস্থের ক্রমটি ধীর গতির কেন?
আমার একটাই অনুমান যে 32 বিটের চেয়ে 64 বিট পূর্ণসংখ্যার যোগ করতে সিপিইউ বেশি সময় নেয়, তবে এটি অসম্ভব বলে মনে হয়। আমার সন্দেহ হয় হাসওয়েল রিপল ক্যারি অ্যাডার ব্যবহার করে না।
আমি এটি এক্সপ্লিপ কেপলার এসআর 1, বিটিডব্লুতে চালাচ্ছি।
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;
}
}
সম্পাদনা করুন: ভিএস 2013 (নীচে), একই সিস্টেম দ্বারা সংকলিত সমমানের সি ++ কোড থেকে ফলাফলগুলি এখানে। দীর্ঘ: 72265ms ইন: 74656 মিমি এই ফলাফলগুলি ডিবাগ 32 বিট মোডে ছিল।
Bit৪ বিট রিলিজ মোডে: দীর্ঘ: 875 মিমি দীর্ঘ দীর্ঘ: 906ms ইন: 1047ms
এটি পরামর্শ দেয় যে আমি যে ফলাফলটি পর্যবেক্ষণ করেছি তা হল সিপিইউ সীমাবদ্ধতার চেয়ে জেভিএম অপ্টিমাইজেশন অদ্ভুততা।
#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;
}
সম্পাদনা: জাভা 8 আরটিএম-এ আবার এটি চেষ্টা করে দেখুন, উল্লেখযোগ্য কোনও পরিবর্তন হয়নি।
currentTimeMillis()
, চলমান কোড যা তুচ্ছভাবে সম্পূর্ণরূপে অপ্টিমাইজ করা যায় ইত্যাদি ইত্যাদি অবিশ্বাস্য ফলাফলের প্রত্যাহার।