इस तरह एक समारोह के लिए:
function threeArgs(x, y, z) {
return x + y + z;
}
है कि इस तरह कहा जाता है:
threeArgs(1, 2, 3);
अनुकूलक सभी में कोई कोड उत्पन्न करने के लिए विकल्प बनाने के लिए स्वतंत्र है। यह निर्धारित करने के लिए काफी आसान है कि कोई दुष्प्रभाव नहीं हैं, क्योंकि फ़ंक्शन बस इसके पैरामीटर मानों का संदर्भ देता है और एक साधारण अभिव्यक्ति का परिणाम देता है। चूंकि वापसी मूल्य को नजरअंदाज कर दिया जाता है, इसलिए रनटाइम को कुछ भी करने का कोई कारण नहीं है।
इसके अतिरिक्त, यदि कोड थे:
something += 6;
क्यों:
something += threeArgs(1, 2, 3);
अनुकूलक कोड मोटे तौर पर के बराबर उत्पन्न करने के लिए तय कर सकते हैं? चूंकि कॉल संख्यात्मक स्थिरांक के साथ बनाया गया था, और यह कोड जनरेशन समय पर उनको सुरक्षित रूप से फोल्ड कर सकता है। यह उस पर रूढ़िवादी हो सकता है, क्योंकि संख्या अजीब हैं, लेकिन यहां वे सभी पूर्णांक हैं इसलिए यह अच्छा कर सकता है।
something += 1 + 2 + 3;
लापता एक पैरामीटर वहाँ है, तथापि, यह हो सकता है कि अनुकूलक जमानत बाहर और एक वास्तविक समारोह कॉल उत्पन्न: यहां तक कि अगर उसने ऐसा नहीं किया, इसे सुरक्षित रूप से समारोह इनलाइन सकता है। इस तरह के एक साधारण समारोह के लिए, फ़ंक्शन कॉल का ओवरहेड प्रदर्शन में बड़े अंतर के लिए आसानी से खाता सकता है।
एक परीक्षण में स्थिरांक के बजाय चर का उपयोग करके, और वास्तव में फ़ंक्शन के वापसी मूल्य का उपयोग करके, आप ऑप्टिमाइज़र को "भ्रमित" कर सकते हैं और इसे कॉल छोड़ने या परिणाम को पूर्व-कंप्यूटिंग करने से रोक सकते हैं, लेकिन आप ' इसे इनलाइनिंग से न रखें। मुझे अभी भी लगता है कि आपका परिणाम उस कारण से दिलचस्प है: यह इस तथ्य को उजागर करता है कि (जैसा कि आज भी वैसे भी) उन अनुकूलक इस तरह से संवेदनशील हैं कि कार्यों को बुलाया जाता है।
@MattWhipple - यह एक दिलचस्प पोस्ट है, लेकिन ओपी के सवाल के साथ इसका क्या संबंध है? (अच्छा सवाल, वैसे, @robC।) –
यह एक दिलचस्प खोज है।सभी तर्कों को भरने के लिए अपना पूरा कोड बदलने से पहले, मैं यह देखने के लिए जांचूंगा कि उन जेएस कार्यान्वयन के लिए एक खुली बग रिपोर्ट है या नहीं, और यदि कोई फ़ाइल नहीं है। –
मुझे दृढ़ता से संदेह है कि रनटाइम पैरामीटर गिनती मैच होने पर फ़ंक्शंस को रेखांकित कर रहा है, लेकिन फ़ंक्शन को वास्तविक फ़ंक्शन कॉल के रूप में अन्यथा चला रहा है। तथ्य यह है कि फंक्शन रिटर्न वैल्यू का कोई भी उपयोग नहीं करता है, इसका मतलब यह हो सकता है कि रनटाइम * कुछ भी नहीं * जब पैरामीटर पूरी तरह से आपूर्ति की जाती है। – Pointy