2012-02-06 11 views
9

CLR via CSharp अध्याय 10 "गुण" में जेफ रिक्टर लिखते हैं:फ़ील्ड या विधि निष्पादन से संपत्ति निष्पादन धीमा क्यों है?

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

क्या यह मामला तब भी है जब संपत्ति को केवल निजी क्षेत्र में वापस करने के लिए परिभाषित किया गया हो? विधि सिंक्रनाइज़ेशन में पसंदीदा क्यों है? और विधि मार्शलबीरफॉबजेक्ट परिदृश्य में क्यों पसंद किया गया है?

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

उत्तर

9

मुझे लगता है कि वह इस बात को बना रहा है कि, क्योंकि कोई संपत्ति किसी भी मनमानी कोड को चला सकती है, कोड कोड को यह नहीं मानना ​​चाहिए कि यह तुरंत खत्म हो जाएगा।

यदि सभी संपत्ति एक क्षेत्र लौटाती है, तो इसके विधि निकाय को वास्तव में जेआईटी कंपाइलर द्वारा रेखांकित किया जाएगा और यह फ़ील्ड एक्सेस के जितना तेज़ होगा। तो ऐसा नहीं है कि गुण किसी भी तरह धीमे हैं; यह है कि वे काले बक्से हैं। यदि आप नहीं जानते कि संपत्ति कैसे कार्यान्वित की जाती है, तो आप इसके बारे में धारणाएं तुरंत वापस नहीं कर सकते हैं।

(कहा जाता है कि धीमी संपत्ति बनाने से .NET Framework Design Guidelines का स्पष्ट उल्लंघन होगा, विशेष रूप से यह एक: "संपत्ति के बजाए एक विधि का उपयोग करें, [यदि] ऑपरेशन फ़ील्ड सेट की तुलना में धीमी गति के आदेश है होगा "।

इसके बजाय विधियों का उपयोग करने के उनके सुझाव के लिए, मैं इसका कोई अर्थ नहीं बना सकता। गुण विधियां हैं: संपत्ति गेटर एक विधि है (आमतौर पर get_PropertyName नामित), और संपत्ति सेटर एक विधि (set_PropertyName) है, और संपत्ति को पढ़ने वाला कोड कोड पर संकलित किया गया है जो get_PropertyName पर एक विधि कॉल करता है। ऐसा कुछ भी खास नहीं है जो किसी विधि से किसी संपत्ति को धीमा कर देगा।

+7

जेफ का मुद्दा यह है कि एक "गेटब्लह" विधि कॉल * पाठक को संवाद करता है * "यह धीमा हो सकता है" और "ब्लाह" संपत्ति संचार करती है "यह लगभग निश्चित रूप से तेज़ है"। तो यदि आप कुछ धीमा करने जा रहे हैं, तो इसे एक विधि बनाएं। मैं पूरी तरह से * इस सलाह से सहमत नहीं हूं - उदाहरण के लिए, मैं अक्सर उन गुणों को बना देता हूं जिनमें धीमे * संभावित रूप से सबसे खराब मामले * होते हैं लेकिन उत्कृष्ट * अमूर्त * प्रदर्शन होते हैं। लेकिन जेफ की सलाह निश्चित रूप से एक अच्छा प्रारंभिक बिंदु है; एक बार जब आप जानते हैं कि आप क्या कर रहे हैं तो इससे विचलित हो जाएं। –

5

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

यदि आपके पास ऐसी संपत्ति है जो लंबे समय तक ले सकती है, तो आपको इसे एक विधि में फिर से लिखना चाहिए। यह आपके कोड को बेहतर प्रदर्शन नहीं करेगा, लेकिन यह अधिक स्पष्ट होगा कि इसमें काफी समय लग सकता है।

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

+0

अच्छी तरह से .. उन्होंने स्पष्ट रूप से कहा था कि "संपत्ति विधि को कॉल करना बहुत धीमा होगा, और इसलिए, किसी विधि को एक विधि को प्राथमिकता दी जाती है"। तो यह केवल उपस्थिति के बारे में नहीं है .. कम से कम जेफ के अनुसार .. –

+1

संपत्ति को कॉल करना धीमा हो जाएगा, और लोग गुणों को धीमा होने की उम्मीद नहीं करते हैं। एक विधि को कॉल करना उतना ही धीमा होगा, लेकिन लोग उम्मीद करते हैं कि कुछ विधियां धीमी हैं। – svick

3

एक विधि संपत्ति से तेज़ नहीं है, लेकिन एक विधि को संपत्ति के रूप में तेज़ी से होने की उम्मीद नहीं है। इसलिए विधि को स्पष्ट करने के लिए प्राथमिकता दी जाती है कि इसमें कुछ समय लग सकता है (इस मामले में थ्रेड सिंक्रनाइज़ेशन के कारण)।

फ़ील्ड बिल्कुल "निष्पादित नहीं" हैं। किसी फ़ील्ड तक पहुंच सीधे मेमोरी तक पहुंच रही है।

+0

एक आवृत्ति फ़ील्ड तक पहुंच * परोक्ष रूप से * स्मृति तक पहुंच है, क्योंकि पहले आपको स्मृति में * रिसीवर * का पता लगाना होगा। –

+0

@Eric: हाँ, यकीन है, मेरा मतलब है कि आप स्मृति को एक्सेस कर रहे हैं, कोड निष्पादित नहीं कर रहे हैं। –

संबंधित मुद्दे