2010-08-16 6 views
9

यदि मैं इंटरफ़ेस संदर्भों के साथ अपने डेल्फी प्रोग्राम में सभी ऑब्जेक्ट संदर्भों को प्रतिस्थापित करता हूं, और उन वस्तुओं का उपयोग करता हूं जो TInterfacedObject से विरासत में प्राप्त होते हैं, तो परिणामस्वरूप एप्लिकेशन पहले की गति के साथ चलेंगे? या संदर्भ गणना गिनती रन पर एक महत्वपूर्ण निष्पादन ओवरहेड जोड़ता है?डेल्फी में निष्पादन गति पर इंटरफेस का कौन सा प्रभाव पड़ता है?

उत्तर

8

संदर्भ गणना आपको प्रभावित कर सकती है यदि आप उन इंटरफेस के बहुत से असाइनमेंट करते हैं (या उन्हें फ़ंक्शन कॉल में गैर-कॉन्स्ट, गैर-चर पैरामीटर के रूप में पास करते हैं)।

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

उस पहलू को कम करने के लिए, हमेशा इंटरफेस को या तो कॉन्स्ट या var पैरामीटर के रूप में पास करें, फ़ंक्शन कॉल परिणाम के रूप में इंटरफेस लौटने से बचें, और इंटरफ़ेस प्रकार के स्थानीय चर के उपयोग को कम करें, कॉन्स पैरामीटर और प्रत्यक्ष ऑब्जेक्ट फ़ील्ड उपयोगों को प्राथमिकता दें।

+0

तो (इंटरफेस में उपयोग के अलावा) 'अंत में प्रयास करें' ब्लॉक का गति पर भी महत्वपूर्ण प्रभाव पड़ता है, भले ही कोई अपवाद न हो? – mjn

+3

हाँ, यह कर सकते हैं, विशेष रूप से सरल प्रक्रियाओं में, क्योंकि एक कोशिश अंत में काफी (ASM स्तर पर) कोड का हिस्सा दर्शाता है, और यह भी सबसे कारगर प्रवेश और निकास कोड जनरेट से संकलक से बचाता है। उदाहरण के लिए इस जाँच, यह एक अंतर्निहित कोशिश अंत में की रक्षा करने कोड है कि निष्पादित नहीं किया गया है की एक बात है, क्योंकि निहित कोशिश अंत में प्रक्रिया वे में, और कोड के लिए नहीं कर रहे हैं करने के लिए संकलक से जुड़े होते हैं कि असफल हो सकता है । तो आप प्रक्रिया कॉल में इसके लिए भुगतान करते हैं, भले ही आप उस कोड को निष्पादित न करें जो असफल हो। http://delphitools.info/2009/05/06/code-optimization-go-for-the-jugular/ –

+1

मैंने अभी आपका जवाब फिर से पढ़ा है - 'फंक्शन कॉल परिणाम के रूप में इंटरफेस लौटने से बचने' के बारे में एक प्रश्न, क्या यह करता है इसका मतलब है कि उदाहरण के लिए एक फैक्ट्री फ़ंक्शन को इंटरफ़ेस संदर्भों द्वारा कक्षाएं वापस नहीं करनी चाहिए लेकिन कक्षा के उदाहरण? तो 'TSomeFactory.CreateX' में' TMyIplementmentOfX' होना चाहिए और इंटरफ़ेस 'IX' रिटर्न प्रकार के रूप में नहीं होना चाहिए? – mjn

6

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

आप निश्चित रूप से लौटने -1 _AddRef में से इस तरह के रूप संदर्भ गिनती निष्क्रिय कर सकते हैं और _Release ओवरराइड करता है, लेकिन वह उन कॉल जनरेट करने से संकलक नहीं रोकता है ...

2

इतना ही नहीं संदर्भ गिनती - बस बुला इंटरफ़ेस संदर्भ के माध्यम से ऑब्जेक्ट की विधियां हमेशा ओवरहेड का तात्पर्य है। Here आप पढ़ सकते हैं कि डेल्फी में इंटरफ़ेस संदर्भ के माध्यम से ऑब्जेक्ट की विधियों को कैसे कॉल किया जाता है।

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