सिद्धांत रूप में, एक स्थिर विधि को एक उदाहरण विधि की तुलना में थोड़ा बेहतर प्रदर्शन करना चाहिए, अन्य सभी चीजें समान होने के कारण, अतिरिक्त छिपे हुए thisपैरामीटर के कारण।
व्यवहार में, यह इतना कम अंतर बनाता है कि यह विभिन्न संकलक निर्णयों के शोर में छिपा होगा। (इसलिए दो लोग असहमत परिणामों के साथ दूसरे से बेहतर साबित कर सकते हैं)। कम से कम नहीं है क्योंकि thisआम तौर पर एक रजिस्टर में पारित किया जाता है और अक्सर उस रजिस्टर में होता है जिसके साथ शुरू करना है।
इस अंतिम बिंदु का मतलब है कि सिद्धांत रूप में, हमें एक स्थिर विधि की अपेक्षा करनी चाहिए जो किसी वस्तु को एक पैरामीटर के रूप में लेती है और इसके साथ कुछ ऐसा करती है जो उसी वस्तु पर एक उदाहरण के रूप में समतुल्य से थोड़ा कम अच्छा हो। फिर भी, अंतर इतना मामूली है कि यदि आप इसे मापने की कोशिश करते हैं तो आप शायद कुछ अन्य संकलक निर्णय को मापेंगे। (विशेष रूप से इस संभावना के बाद से कि संदर्भ एक रजिस्टर में होने के कारण पूरे समय बहुत अधिक है)।
वास्तविक प्रदर्शन अंतर कम हो जाएगा कि क्या आपको कृत्रिम रूप से स्मृति में ऑब्जेक्ट मिला है कुछ ऐसा करने के लिए जो स्वाभाविक रूप से स्थिर होना चाहिए, या आप जटिल तरीके से ऑब्जेक्ट-पासिंग की जंजीरों को उलझा रहे हैं कि स्वाभाविक रूप से क्या होना चाहिए।
इसलिए नंबर 1 के लिए। जब राज्य को बनाए रखना कोई चिंता की बात नहीं है, तो हमेशा स्थिर रहना बेहतर होता है, क्योंकि यही स्टेटिक है । यह एक प्रदर्शन की चिंता नहीं है, हालांकि संकलक अनुकूलन के साथ अच्छी तरह से खेलने का एक समग्र नियम है - यह अधिक संभावना है कि कोई उन मामलों के अनुकूलन के प्रयास में गया जो सामान्य उपयोग के साथ आते हैं जो अजीब उपयोग के साथ आते हैं।
नंबर 2. कोई फर्क नहीं पड़ता। प्रत्येक सदस्य के लिए प्रति-वर्ग लागत की एक निश्चित राशि है, यह दोनों की शर्तें है कि कितना मेटाडेटा है, वास्तविक DLL या EXE फ़ाइल में कितना कोड है, और कितना jitted कोड होगा। यह वही है चाहे वह उदाहरण हो या स्थिर।
आइटम 3 के साथ, thisइस प्रकार thisहै। हालाँकि ध्यान दें:
thisपैरामीटर एक विशेष रजिस्टर में पारित हो जाता है। एक ही क्लास के भीतर एक इंस्टेंस मेथड को कॉल करते समय, यह संभवतः पहले से ही उस रजिस्टर में होगा (जब तक कि उसे स्टेक नहीं किया गया था और किसी कारण से इस्तेमाल किया गया रजिस्टर), और इसलिए thisइसे सेट करने के लिए कोई भी कार्रवाई करने की आवश्यकता नहीं है। । यह एक निश्चित सीमा पर लागू होता है, उदाहरण के लिए पहले दो मापदंडों को विधि के पहले दो मापदंडों को बनाता है जो इसे बनाता है।
चूंकि यह स्पष्ट होगा कि thisयह शून्य नहीं है, इसलिए इसका उपयोग कुछ मामलों में कॉल को अनुकूलित करने के लिए किया जा सकता है।
चूंकि यह स्पष्ट होगा कि thisयह अशक्त नहीं है, इससे इनलाइन विधि कॉल फिर से अधिक कुशल हो सकती है, क्योंकि विधि कॉल को नकली करने के लिए निर्मित कोड कुछ नल-जांचों को छोड़ सकता है जो इसे वैसे भी आवश्यकता हो सकती है।
उस ने कहा, शून्य जांच सस्ते हैं!
यह ध्यान देने योग्य है कि सामान्य स्थैतिक विधियाँ किसी वस्तु पर कार्य करती हैं, उदाहरण के तरीकों के बजाय, http://joeduffyblog.com/2011/10/23/on-generics-and-some-of- पर चर्चा की गई कुछ लागतों को कम कर सकती हैं। संबंधित-ओवरहेड्स / उस मामले में जहां दिए गए स्थिर को किसी दिए गए प्रकार के लिए नहीं बुलाया जाता है। जैसा कि वह कहते हैं, "एक तरफ के रूप में, यह पता चला है कि विस्तार के तरीके जेनेरिक अमूर्त को अधिक भुगतान के लिए खेलने का एक शानदार तरीका है।"
हालांकि, ध्यान दें कि यह केवल विधि द्वारा उपयोग किए जाने वाले अन्य प्रकार के तात्कालिकता से संबंधित है, जो अन्यथा मौजूद नहीं है। जैसे, यह वास्तव में बहुत सारे मामलों पर लागू नहीं होता है (कुछ अन्य उदाहरण विधि उस प्रकार का उपयोग करते हैं, कुछ अन्य कोड कहीं और उस प्रकार का उपयोग करते हैं)।
सारांश:
- ज्यादातर उदाहरण बनाम स्टेटिक की प्रदर्शन लागत नगण्य से कम है।
- आम तौर पर जहां आप उदाहरण के लिए स्थैतिक का दुरुपयोग करते हैं या इसके विपरीत, वहां क्या लागतें आती हैं। यदि आप इसे स्थिर और उदाहरण के बीच अपने निर्णय का हिस्सा नहीं बनाते हैं, तो आपको सही परिणाम मिलने की अधिक संभावना है।
- ऐसे दुर्लभ मामले हैं, जिनमें अन्य प्रकारों में स्थिर जेनेरिक विधियों का निर्माण कम प्रकार से होता है, उदाहरण के तौर पर जेनेरिक विधियां, जो इसे कभी- कभी उपयोग किए जाने वाले छोटे लाभ के लिए बना सकती हैं (और "शायद ही कभी" संदर्भित करता है कि यह किस प्रकार के साथ प्रयोग किया जाता है। अनुप्रयोग का जीवनकाल, न जाने कितनी बार कहा जाता है)। एक बार जब आप उस लेख के बारे में बात कर रहे होते हैं, तो आप देखेंगे कि यह वैसे भी अधिकांश स्थैतिक-बनाम-निर्णय निर्णयों के लिए 100% अप्रासंगिक है। संपादित करें: और इसमें ज्यादातर लागत केवल ngen के साथ है, न कि jitted कोड के साथ।
संपादित करें: सिर्फ एक नोट कि कैसे सस्ते नल-चेक हैं (जो मैंने ऊपर दावा किया है)। .NET में अधिकांश null- चेक null के लिए जाँच नहीं करते हैं, बल्कि वे जारी रखते हैं कि वे इस धारणा के साथ क्या करने जा रहे थे कि यह काम करेगा, और यदि एक एक्सेस अपवाद होता है तो यह एक में बदल जाता है NullReferenceException। जैसे, ज्यादातर जब वैचारिक रूप से C # कोड में एक शून्य-जांच शामिल है क्योंकि यह एक उदाहरण सदस्य तक पहुंच रहा है, अगर यह सफल होता है तो लागत वास्तव में शून्य है। एक अपवाद कुछ इनबिल्ड कॉल होगा, (क्योंकि वे व्यवहार करना चाहते हैं जैसे कि उन्होंने एक उदाहरण सदस्य को बुलाया है) और उन्होंने एक ही व्यवहार को ट्रिगर करने के लिए एक फ़ील्ड मारा, इसलिए वे बहुत सस्ते भी हैं, और वे अभी भी अक्सर बाहर रह सकते हैं (उदाहरण के लिए अगर विधि में पहला कदम एक क्षेत्र तक पहुँचने के रूप में शामिल था)।