मैं एक सर्फेस प्रो 2 टैबलेट पर जावा 7 अपडेट 45 x64 (कोई 32 बिट जावा स्थापित) के साथ विंडोज 8.1 x64 चला रहा हूं।
नीचे का कोड 1688ms लेता है जब i का प्रकार एक लंबा और 109ms होता है जब मैं एक इंट होता है। 64 बिट JVM के साथ 64 बिट प्लेटफ़ॉर्म पर इंट की तुलना में लॉन्ग (64 बिट प्रकार) का परिमाण धीमा क्यों है?
मेरा एकमात्र अनुमान यह है कि सीपीयू 32 बिट की तुलना में 64 बिट पूर्णांक जोड़ने में अधिक समय लेता है, लेकिन ऐसा लगता है कि संभावना नहीं है। मुझे संदेह है कि हसवेल रिपल-कैरी योजक का उपयोग नहीं करता है।
मैं इसे ग्रहण केपलर 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;
}
}
संपादित करें: यहां वीएस 2013 (नीचे), समान प्रणाली द्वारा संकलित समकक्ष सी ++ कोड के परिणाम हैं। लंबा: 72265ms int: 74656ms वे परिणाम डीबग 32 बिट मोड में थे।
64 बिट रिलीज़ मोड में: लंबा: 875 मी लंबा लंबा: 906ms int: 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()
, कोड का उपयोग करना , रनिंग कोड जो तुच्छ रूप से पूरी तरह से अनुकूलित किया जा सकता है, आदि अविश्वसनीय परिणाम का पुन: उपयोग करता है।