यह Java method धीमी गति से गणना का अनुकरण के लिए मानदंड में इस्तेमाल किया जाता है:इस विधि को अनुकूलित क्यों नहीं किया जाता है?
static int slowItDown() {
int result = 0;
for (int i = 1; i <= 1000; i++) {
result += i;
}
return result;
}
यह IMHO एक बहुत बुरा विचार है, के रूप में अपने शरीर return 500500
द्वारा प्रतिस्थापित कर सकते हैं। ऐसा कभी नहीं होता है; शायद अमेरिकी स्काईट के रूप में वास्तविक कोड के लिए अप्रासंगिक होने के कारण इस तरह के अनुकूलन की वजह से अप्रासंगिक है।
दिलचस्प बात यह है result += 1;
साथ एक से थोड़ा सरल तरीका पूरी तरह से दूर हो जाता है अनुकूलित (कैलिपर ०.४६०५४३ एनएस रिपोर्ट)।
लेकिन फिर भी जब हम सहमत हैं कि दूर एक निरंतर परिणाम लौटने के तरीकों के अनुकूलन वास्तविक कोड के लिए बेकार है, वहां अभी भी पाश unrolling, जो
static int slowItDown() {
int result = 0;
for (int i = 1; i <= 1000; i += 2) {
result += 2 * i + 1;
}
return result;
}
की तरह कुछ करने के लिए ले जा सकता है है तो मेरे सवाल बनी हुई है: क्यों नहीं अनुकूलन है यहाँ प्रदर्शन किया?
क्या मैं मूल रूप से लिखा था के विपरीत; मैंने कुछ ऐसा देखा होगा जो वहां नहीं था।
आप यह कैसे परीक्षण किया? यदि जेआईटी का उपयोग करना है तो आप कोड को थोड़ा बदलकर समान चीजों का निरीक्षण करेंगे, क्योंकि इसमें बहुत सारे ह्यूरिस्टिक्स शामिल हैं। आप जेआईटी के लिए इनलाइन की तरह सबसे सरल अनुकूलन भी लागू करने की गारंटी नहीं देते हैं क्योंकि इसे केवल एक बार आवश्यक समझा जाता है। –
क्या यह वास्तविक कोड है? यदि आप जानते हैं कि इसका क्या मतलब है, तो इस तरह कोड क्यों न लिखें? मैं संतुष्ट हूं कि जेआईटी कंपाइलर्स को वास्तविक कोड में ऑप्टिमाइज़ करने के बजाय * वास्तविक * कोड को अनुकूलित करने के लिए ट्यून किया गया है जो वास्तविकता में नहीं होगा। (स्टेटिक अनुकूलक * इस से थोड़ा अधिक छूट है, लेकिन याद रखें कि हर अनुकूलन एक JIT कम्पाइलर खोजने की कोशिश करता निष्पादन समय में एक लागत है।) –
@JonSkeet:, शर्मनाक मैं निरीक्षण, उस लिंक अमरूद बेंच मार्किंग कोड, पर ले जाए, जो मैं आमतौर पर विश्वास करने की उम्मीद करता हूं ... –