मैंने माइक्रो-ऑप्टिमाइज़ेशन प्रश्न को देखते हुए कल (here) देखा, मुझे कुछ अजीब मिला: जावा में कथन थोड़ा बूलियन की एक सरणी में एक बूलियन मान को देखने से तेज़ी से चल रहा है।जावा में लुकअप टेबल का उपयोग करने से कई कोड या "कथन" के साथ यह कोड थोड़ा तेज़ क्यों है?
मेरे परीक्षणों में, long
पर 0 से 1 बिलियन के मानों के नीचे एल्गोरिदम चलाते हुए, alg1 लगभग 2% तेज है। (मैंने ऑर्डर को बदल दिया है जिसमें एल्गोरिदम का परीक्षण किया गया है, और मुझे एक ही परिणाम मिलते हैं)। मेरा सवाल है: alg1 तेज़ क्यों है? मुझे उम्मीद है कि यह एक लुकअप टेबल का उपयोग करने के बाद से alg2 थोड़ा तेज होगा, जबकि alg1 को 4 तुलनाओं और 3 या संचालन के 75% इनपुट के लिए निष्पादित करना होगा।
private final static boolean alg1(long n)
{
int h = (int)(n & 0xF);
if(h == 0 || h == 1 || h == 4 || h == 9)
{
long tst = (long)Math.sqrt(n);
return tst*tst == n;
}
return false;
}
private final static boolean[] lookup = new boolean[16];
static
{
lookup[0] = lookup[1] = lookup[4] = lookup[9] = true;
}
private final static boolean alg2(long n)
{
if(lookup[(int)(n & 0xF)])
{
long tst = (long)Math.sqrt(n);
return tst*tst == n;
}
else
return false;
}
आप उत्सुक हैं, तो इस कोड को अगर एक नंबर एक पूर्ण वर्ग है, और तथ्य यह है कि सही वर्गों में 0, 1, 4, या 9 में हेक्स समाप्त होना चाहिए इस्तेमाल परीक्षण कर रहा है।
प्रोसेसर के स्तर पर एक साधारण देखने आम तौर पर काफ़ी भी गणना की एक छोटी स्ट्रिंग की तुलना में तेजी है। मैं सोच जी यह सीमाओं की जांच/अन्य ओवरहेड है जो जावा प्रक्रिया को प्रबंधित करने के लिए जोड़ता है। –
एफटीएल की जांच सीमाएं! –