2010-03-05 15 views
15

यह blog कहतेक्या सी # विधियों के लिए रिटर्न स्टेटमेंट जोड़ना प्रदर्शन में सुधार करता है?

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

मुझे पूरा यकीन है कि यह एक झूठा बयान है। लेकिन वहां राय विशेषज्ञों को प्राप्त करना चाहता था। आप लोग क्या सोचते हैं?

+4

मछली पकड़ने लगता है, वास्तव में, लेकिन मैं जेआईटी गुरु वजन में डाल दूंगा! – mjv

+4

और अधिक मज़ेदार बयान हैं। "सरणी के स्थान पर 'ArrayLists' का प्रयोग करें", "ValueTypes के साथ डिज़ाइन"। मेरा मतलब है, ऐरेलिस्ट? मुक्केबाजी के साथ यह बहुत अच्छा है। और कक्षाओं के बजाय structs का उपयोग करने के लिए वास्तव में जानना बहुत कुछ है, अगर ज्यादातर लोग मिश्रण नहीं करते हैं - मुझे सहित। अजीब "टिप"। – Razzie

+0

@ रज़ी की टिप्पणी की लाइनों के साथ, मैं उस पोस्ट को नमक के अनाज के साथ ले जाऊंगा, यह .NET 2.0 दिनों में भी जोड़े गए आइटमों को ध्यान में रखता नहीं है .... –

उत्तर

10

यह कथन सी # पर लागू नहीं होता है।

सी # के साथ आपको एक वापसी के बिना एक वैध कार्य करने के लिए "वापसी" सेट करना होगा, आपको "सभी कोड पथ एक मूल्य वापस नहीं" के प्रभाव में संकलन त्रुटि मिलती है।

वीबीएनईटी के साथ यह लागू होगा क्योंकि वीबी.नेट के पास एक स्पष्ट वापसी की आवश्यकता नहीं है, और आपको ऐसे फ़ंक्शन प्राप्त करने की अनुमति मिलती है जो कभी भी मूल्य वापस न करें, साथ ही आपको नाम के नाम से वापसी सेट करने की अनुमति दें कार्यक्रम।

VB.NET में एक उदाहरण

प्रदान करने के लिए आप इस

Function myFunction() As String 
    myFunction = "MyValue" 
End Function 

Function myFunction2() As String 
    'Your code here 
End Function 

ऊपर compiles, न तो एक स्पष्ट "रिटर्न", और अधिक इस में शामिल भूमि के ऊपर है के साथ क्या कर सकते हैं।

आप के साथ सी #

string myFunction() 
{ 
    //Error due to "Cannot assign to 'myFunction' because it is a 'Method Group' 
    myFunction = "test"; 
} 

string myFunction2() 
{ 
    //Error due to "not all code paths return a value 
} 

यह करने के लिए प्रयास करते हैं तो मेरे टिप्पणियां त्रुटियों कि आप ध्यान दें।

+0

... व्यक्तिगत रूप से? – Svish

+0

हाँ, इसे हटा दिया गया .... यह एक लंबी सुबह पहले से ही ... –

+0

मैंने ब्लॉग के ओपी के उद्धृत पाठ को निक के अनुमान के रूप में शॉर्ट-सर्किट प्रोसेसिंग में वापसी विवरणों का उपयोग करके अर्थ के रूप में पढ़ा है। – chsh

1

मेरा एकमात्र अनुमान यह है कि वह वीबीएनईटी नहीं सी # के बारे में बात कर रहा है। VB.NET आप इस तरह समथिंग के मूल्यों

Public Function GetSomething() As Int 
    GetSomething = 4 
End Function 

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

+0

इसके अतिरिक्त यह पोस्ट: http://stackoverflow.com/questions/451025/vb-net-function-return प्रदर्शन और VB.Net में रिटर्न स्टेटमेंट के बारे में बात करते हैं: उत्पन्न आईएल लगभग उसी युग की प्रतीत होती है, गति एक जैसी है। (मैंने खुद को एक डिस्सेप्लोर नहीं किया लेकिन इस प्रश्न में प्रस्तुत एक तार्किक प्रतीत होता है) –

+0

@ डॉटजो: कैसे? यह उन मामलों के लिए वास्तव में काफी उपयोगी है जहां आप सी # में, 'परिणाम' (या समान) चर घोषित करना होगा। व्यक्तिगत रूप से, मैंने सी # शैली को पूरी तरह से अनुकूलित किया है, लेकिन मैं एक ठोस तर्क नहीं बना सकता कि क्यों वीबी शैली खराब होनी चाहिए। मेरे लिए, यह बस आदत का विषय है, और ऐसा करने का वीबी तरीका पूरी तरह से उचित है। –

+0

@ कोनराड रुडॉल्फ प्रतीक्षा करें ... यह वाक्यविन्यास 'रिटर्न 4' जैसा नहीं है? क्या यह फ़ंक्शन के अंत तक परिणाम रखता है और इसे कई बार सेट किया जा सकता है? – dotjoe

4

पोस्ट अस्पष्ट है। एक सी # डेवलपर होने के नाते, मेरा पहला विचार "क्या विरोध था?"। हालांकि, वह कुछ इस तरह की चर्चा करते हुए किया जा सकता है:

public bool MyFunction() 
{ 
    bool result = false; 
    if (someCondition == true) 
    { 
     // Do some processing 
     result = true; 
    } 
    else if (someOtherCondition == true) 
    { 
     // Do some processing 
     result = true; 
    } 
    // ... keep going 

    return result; 
} 

वह सुझाव दे जा सकता है कि return true; साथ result = true; बयानों की जगह बेहतर प्रदर्शन कर सकते हैं। मुझे उस बारे में निश्चित रूप से यकीन नहीं है ... वह उस बिंदु पर जेआईटी सिद्धांत में बहुत गहरा है, और मुझे लगता है कि किए गए किसी भी लाभ को अन्य प्रदर्शन सुधारों की तुलना में बहुत मामूली होगा।

+0

इसके साथ सहमत हैं - यह उन समयों में से एक है जहां आपको निर्णय लेना होगा कि महत्वहीन प्रदर्शन लाभ की तुलना में रखरखाव अधिक महत्वपूर्ण है! – Fenton

0

आम तौर पर 2 स्पॉट होते हैं जिनमें मैं एक फ़ंक्शन से बाहर निकलता हूं।

if (myParameter == null) 
    throw new ArgumentNullException("myParameter"); 

और/या विधि के अंत में: मेरी विधियों में से बहुत शुरुआत में आने वाले डेटा को मान्य करने के।


private bool GetSomeValue() 
{ 
    bool returnValue = false; 
    // some code here 
    if (some condition) 
    { 
     returnValue = some expression 
    } 
    else 
    { 
     returnValue = some other expression; 
    } 
    return returnValue; 
}

कारण मैं सशर्त के अंदर वापस नहीं करते हैं, इसलिए वहाँ समारोह का 1 निकास बिंदु, यह डिबगिंग के साथ मदद करता है। कोई भी 12 रिटर्न स्टेटमेंट्स के साथ एक विधि को बनाए रखना चाहता है। लेकिन यह सिर्फ मेरी व्यक्तिगत राय है। मैं पठनीयता के पक्ष में गलती करूंगा, और ऑप्टिमाइज़ेशन के बारे में चिंता न करें जबतक कि आप वास्तविक समय से पहले-तेजी से स्थिति से निपट नहीं रहे हैं।

+4

आईएमओ एकल रिटर्न पॉइंट धारणा आधुनिक सॉफ्टवेयर में अप्रासंगिक है। मैं तुरंत वापसी का बयान देखता हूं और आश्चर्यचकित होने के बजाय बाहर निकलने वाले कोड को जानना चाहता हूं कि क्या वापसी अगर आप ब्लॉकों के अंदर से वापस लौट सकते हैं तो विधि को आगे और अधिक तरीके से छेड़छाड़ की जाती है। –

+1

@ क्रिस मैरिसिक - मैं सहमत हूं। एकाधिक-रिटर्न-है-खराब तर्क कोड में * शोर * जोड़ता है। यदि आपको 5 स्थानों पर वापस जाना है, तो संभावित पाठक के साथ संभावित परिवर्तनकर्ता के साथ अंत तक 5 तरीकों को ब्रांच करने से भी बुरा नहीं हो सकता है। – Kit

+0

@ किट मुझे यह सुनिश्चित करने के लिए दो बार आपकी टिप्पणी पढ़नी पड़ी कि मैं इसे समझ गया हूं। मैं आपसे सहमत हूं, जब आप तत्काल वापस लौट सकते हैं तो लौटने में देरी करना चुनना ** ** कोड में शोर जोड़ देगा। –

2

यह कुछ हद तक सच है, दोनों VB.NET और C# के लिए। सी # प्रोग्रामर को वैरिएबल घोषित करना है जो रिटर्न वैल्यू को स्पष्ट रूप से रखता है, यह वीबी.नेट में स्वचालित है। अधिकांश रिटर्न मान ईएक्स या आरएक्स रजिस्टर में वापस आते हैं, जेआईटी कंपाइलर को फ़ंक्शन से बाहर होने से पहले रिटर्न वैल्यू वैरिएबल से रजिस्टर लोड करने के लिए कोड उत्पन्न करना होता है। जब आप रिटर्न स्टेटमेंट का उपयोग करते हैं, तो जेआईटी कंपाइलर को ईएक्स रजिस्टर को सीधे लोड करने का अवसर हो सकता है, या पहले से ही सही मान वाला रजिस्टर हो सकता है, और लोड-से-वेरिएबल निर्देश को छोड़कर फ़ंक्शन निकास कोड पर जा सकता है।

यह एक बहुत बड़ा "शायद" बीटीडब्ल्यू है, असली कोड हमेशा if() कथन के साथ कुछ अभिव्यक्ति का परीक्षण करता है। उस अभिव्यक्ति का मूल्यांकन करना लगभग हमेशा ईएक्स रजिस्टर का उपयोग करना शामिल है, इसे अभी भी वापसी मूल्य के साथ पुनः लोड करना होगा। X64 जेआईटी कंपाइलर x86 कंपाइलर की तुलना में एक पूरी तरह से अलग काम करता है, बाद वाला हमेशा कुछ स्पॉट चेक में चर का उपयोग करता प्रतीत होता है। इसलिए जब तक आप विंडोज के 64-बिट संस्करण पर नहीं चलते हैं तब तक आप आगे बढ़ने की संभावना नहीं रखते हैं।

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

+0

एक ऐसा मामला है कि रिटर्न सिंटैक्स संकलक के लिए सरलीकृत करता है, यह पूंछ कॉल रिकर्सन ऑप्टिमाइज़ेशन के रूप में होता है क्योंकि रिटर्न कॉल यहां कुछ आसान होता है क्योंकि कॉल के पूंछ को खोजने के लिए शेष कोड का पता लगाने की आवश्यकता नहीं होती है -क्रेशिव या नहीं (बस विधि निकाय के अंत तक कूदने के लिए देखो)। लेकिन मुझे इस विशिष्ट मामले के बारे में जेआईटी कंपाइलर की वर्तमान स्थिति नहीं पता है, इसलिए यह कोई समस्या भी नहीं हो सकती है। –

+0

गंदे छोटे विवरण !!! मैं यही बात कर रहा हूं .. धन्यवाद nobugz :) – HashName

3

मैं असहमत हूं - मुझे लगता है कि प्रत्येक विधि में से एक एकल और एकल कोड को पढ़ने और डीबग करने के लिए कोड को अधिक आसान बनाता है। फ़ंक्शन में एकाधिक रिटर्न स्टेटमेंट नेविगेटिंग कोड को अधिक कॉम्प्लेक्स बना सकते हैं। वास्तव में (यदि रीफैक्टर के लिए संभव हो) तो कई निकास के साथ बड़े कार्यों के मुकाबले अधिक छोटे कार्यों के लिए बेहतर होता है।

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