जावा में विधि मापदंडों को अंतिम घोषित करने का कोई प्रदर्शन कारण है?


117

जावा में विधि मापदंडों को अंतिम घोषित करने का कोई प्रदर्शन कारण है?

जैसे की:

public void foo(int bar) { ... }

बनाम:

public void foo(final int bar) { ... }

यह मानते हुए कि barकेवल पढ़ा जाता है और कभी संशोधित नहीं होता है foo()


मैं एक कारण के बारे में नहीं सोच सकता कि संकलक देखभाल करेगा कि आपने विधि पैरामीटर अंतिम घोषित किया है या नहीं। लेकिन इस प्रश्न का वास्तविक उत्तर है - दो कार्य लिखें, एक अंतिम मापदंडों के साथ और एक नियमित मापदंडों के साथ। उन्हें प्रत्येक बार एक लाख बार चलाएं और देखें कि क्या कोई ध्यान देने योग्य रनटाइम अंतर है। यदि आप प्रदर्शन के बारे में चिंतित हैं, तो अपने कोड पर कुछ प्रोफाइलिंग कार्य करना बहुत महत्वपूर्ण है और यह पता करें कि वास्तव में क्या आपको धीमा कर रहा है। यह लगभग निश्चित रूप से नहीं है कि आप इसे क्या होने की उम्मीद करेंगे :)
माइक ब्लैंडफोर्ड 21

1
मेरा सुझाव है कि आप कभी भी माइक्रो बेंचमार्क न लिखें। आप नहीं जानते कि जेआईटी कौन सा अनुकूलन कर सकता है और कब, और आपको यह पता
लगाने की

अच्छी तरह से हो सकता है, लेकिन यहां किसी ने भी एक माइक्रोबेनमार्क नहीं लिखा या सुझाव दिया है ...
किप

1
@ माइक ब्लैंडफोर्ड का जवाब एक माइक्रो-बेंचमार्क का उपयोग करने का सुझाव देता है?
बेन पेज

जावा में माइक्रो बेंचमार्क लिखना बहुत ही मुश्किल काम है
एडमंडो 1984

जवाबों:


97

अंतिम कीवर्ड स्थानीय चर और मापदंडों के लिए वर्ग फ़ाइल में प्रकट नहीं होता है, इस प्रकार यह रनटाइम प्रदर्शन को प्रभावित नहीं कर सकता है। इसका उपयोग केवल कोडर्स के इरादे को स्पष्ट करने के लिए है कि चर को बदला नहीं जाना चाहिए (जो कई इसके उपयोग के लिए संदिग्ध कारण मानते हैं), और अनाम आंतरिक वर्गों के साथ व्यवहार करते हैं।

इस बात पर बहुत तर्क है कि क्या विधि में अंतिम संशोधनकर्ता के पास कोई भी प्रदर्शन लाभ है क्योंकि विधियों को अनुकूलन संकलक द्वारा वैसे भी संशोधित किया जाएगा, भले ही संशोधक की परवाह किए बिना। इस मामले में इसका उपयोग केवल विधि के ओवरराइडिंग को प्रतिबंधित करने के लिए भी किया जाना चाहिए।


5
आपको लगता है कि अंतिम चर / परम को लूप चर के रूप में अनुकूलित किया जा सकता है ... लेकिन एक अच्छा संकलक / रनटाइम को वैसे भी अंतिम रूप से पता लगाने में सक्षम होना चाहिए ...
जॉन गार्डनर

9
मैंने देखा है कि सन के कंपाइलर ने मामूली बायटेकोड का उत्सर्जन किया है जब दो तरीकों के बीच एकमात्र अंतर स्थानीय चर की "अंतिमता" रहा है। माइक्रो-ऑप्टिमाइजेशन एक वास्तविक चीज है, और संकलक वास्तव में उन्हें बनाते हैं। वास्तव में, जो मायने रखता है, वह यह है कि JIT बायटेकोड के साथ क्या करता है, और स्थानीय संदर्भ जब बायटेकोड पर संकलित होते हैं, तो उनकी "अंतिमता" खो देते हैं। मुझे लगता है यही कारण है कि अंतिम स्थानीय चर के बारे में बहुत अटकलें हैं: यह काफी गैर-निर्धारक है कि परिणाम क्या हैं। हालांकि, अंतिम स्थानीय लोगों का उपयोग करना बायोटेक को प्रभावित कर सकता है - जो इसके लायक है।
क्रिस्टोफर शुल्त्स

जैसा कि यह गैर-नियतात्मक है, वास्तव में अनुकूलन पर निर्भर करने का कोई तरीका नहीं है। 2008 में मूल उत्तर के बाद से VM कार्यान्वयन में बहुत कुछ बदल गया होगा ;-)
रॉबिन

15

अंतिम पैरामीटर के लिए एकमात्र लाभ यह है कि इसका उपयोग अनाम नेस्टेड कक्षाओं में किया जा सकता है। यदि कोई पैरामीटर कभी नहीं बदला जाता है, तो संकलक पहले से ही पता लगा लेगा कि अंतिम संशोधन के बिना भी यह सामान्य ऑपरेशन के हिस्से के रूप में है। यह बहुत दुर्लभ है कि कीड़े अप्रत्याशित रूप से असाइन किए गए पैरामीटर के कारण होते हैं - यदि आपके तरीके इंजीनियरिंग के इस स्तर की आवश्यकता के लिए पर्याप्त बड़े हैं, तो उन्हें छोटा करें - आपके द्वारा कॉल की जाने वाली विधियां आपके मापदंडों को नहीं बदल सकती हैं।


8
"यह बहुत दुर्लभ है कि कीड़े अप्रत्याशित रूप से असाइन किए गए पैरामीटर के कारण होते हैं"। यह आपके विचार से अधिक सामान्य है ...
RAY

2
@ आप सही हो सकते हैं, वास्तव में मेरे पास उस दावे का समर्थन करने के लिए कोई डेटा (अपने अनुभव से परे) नहीं है।
डोबेस वांडरमेर

@DobesVandermeer अधिक सटीक होना, जो वास्तव में "अंतिम पैरामीटर के लिए लाभ " नहीं है। आप जो भी वर्णन कर रहे हैं, वह किसी भी स्थानीय चर (जिनमें से मैं पैरामीटर भी शामिल है) के लिए सिंटैक्स आवश्यक है ताकि अनाम नेस्टेड वर्ग के स्थानीय दायरे को दिखाई दे सके।
स्वोबी

0

कंपाइलर जो क्लास लोडिंग के बाद काम करते हैं, जैसे कि जेआईटी कंपाइलर्स, अंतिम तरीकों का लाभ उठा सकते हैं। नतीजतन, अंतिम घोषित तरीकों से कुछ प्रदर्शन लाभ हो सकते हैं।

http://www.javaperformancetuning.com/tips/final.shtml

ओह और एक और अच्छा संसाधन

http://mindprod.com/jgloss/final.html


10
यह सवाल अंतिम घोषित किए जाने वाले मापदंडों के बारे में था, जिसका कोई प्रदर्शन प्रभाव नहीं है।
रॉबिन

आधुनिक JIT'S (हॉटस्पॉट) के फाइनल में कोई भी (औसत दर्जे का) प्रदर्शन प्रभाव नहीं होता है, चाहे वह मापदंडों पर लागू हो या वर्ग
kohlerm

2
आपके द्वारा लिंक किए गए दो लेख सुझाव देते हैं कि फ़ाइनल डेवलपर्स के लिए सिमेंटिक मार्क है, और जेआईटी कंपाइलर फ़ाइनल का उपयोग कर सकते हैं (लेकिन जैसा कि अन्य ने बताया है, उन्हें वास्तव में उस जानकारी की आवश्यकता नहीं है)। इसलिए फाइनल बल्कि सिमेंटिक है, जो आधुनिक सी / ++ कंपाइलरों के समानांतर समानांतर क्षमता के साथ चर और तरीकों की निरंतरता के लिए है, भले ही वे स्पष्ट रूप से चिह्नित न हों।
रॉन

0

इस विधि के भीतर घोषित किए गए गैर-अंतिम स्थानीय चर का उपयोग करने के लिए बस एक और बिंदु - आंतरिक वर्ग उदाहरण स्टैक फ्रेम को रेखांकित कर सकता है, इसलिए स्थानीय चर गायब हो सकता है जबकि आंतरिक वस्तु अभी भी जीवित है


-2

मुझे लगता है कि संकलक संभवत: सभी निजी स्थिर अंतिम चर को हटा सकता है, जिसमें एक आदिम प्रकार है, जैसे कि इंट, और उन्हें सीधे सी + + मैक्रो के समान कोड में सीधे इनलाइन करें।

हालाँकि, यह अभ्यास में किया जाता है, तो मुझे कोई सुराग नहीं है, लेकिन यह कुछ स्मृति को बचाने के लिए किया जा सकता है।


सवाल निजी स्टेटक अंतिम चर के बारे में नहीं है।
लोर्ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.