2010-08-04 5 views
5

सी # में, निम्नलिखित तीन विकल्पों की तुलना करते समय प्रदर्शन में कोई अंतर होगा?उप-ब्लॉक के अंदर चर को घोषित करने में प्रदर्शन में सुधार होगा?

एक

void ONE(int x) { 

if (x == 10) 
{ 
    int y = 20; 
    int z = 30; 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 

दो

void TWO(int x) { 

int y; 
int z; 

if (x == 10) 
{ 
    y = 20; 
    z = 30; 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 

तीन

void THREE(int x) { 

int y = 20; 
int z = 30; 

if (x == 10) 
{ 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 
+3

सं।आप 'माइक्रो-ऑप्टिमाइज़ेशन' कहलाते हैं, इसके बारे में चिंता कर रहे हैं: क्या आपने यह सुनिश्चित करने के लिए बेंचमार्क किया है कि वास्तव में आपको प्रदर्शन समस्या है? –

+0

@ मिच: मैं क्रेग के पोस्ट में कहीं भी नहीं देखता हूं, उसके कोड में धीमी प्रदर्शन करने की शिकायत है। पूछने के लिए उसका एकदम सही और बुद्धिमान सवाल था, और इसलिए उसने ऐसा किया। ऐसा लगता है कि हम कुछ भी @ एसओ पोस्ट नहीं कर सकते जिसमें प्रदर्शन शामिल है। –

+2

मैं इस सूक्ष्म अनुकूलन को भी नहीं बुलाऊंगा, बल्कि नैनो-अनुकूलन। कोई भी जो प्रोफाइलर के आउटपुट को देखता है जानता है कि एक चर को स्टोर करने या फ़ंक्शन को कॉल करने के लिए किए गए समय के बारे में चिंता करना लज्जास्पद रूप से नगण्य है। –

उत्तर

4

और सभी समान हैं (और वे आमतौर पर नहीं कर रहे हैं, जिसके कारण आप सामान्य रूप से वास्तव में यह परीक्षण करने के लिए है) के बाद से स्थानीय चर अंत के दायरे वाला, ONE() और TWO() ही आईएल निर्देश उत्पन्न करनी चाहिए पूरी विधि THREE()होगाx==10 धीमा अगर अन्य दो स्थानीय चर में मूल्यों को स्टोर करने के लिए परेशान नहीं होंगे।

सभी तीन समान मात्रा में स्मृति लेते हैं- सभी चरों के लिए स्मृति आवंटित की जाती है भले ही उनमें कुछ भी संग्रहीत न हो। जेआईटी कंपाइलर यहां एक अनुकूलन कर सकता है, हालांकि, अगर यह कभी अप्रयुक्त चर के लिए दिखता है।

+0

+1 एक और आईएलओ के लिए +1। सी #/सीएलआर में विधि स्तर स्कोपिंग एक स्नीकी है, खासकर सी ++ प्रोग्रामर के लिए। –

+0

संकलक अभी भी विकल्प वन में स्मृति आवंटित करेगा जब x! = 10? – CJ7

+0

@ क्रैग, हाँ यह होगा-क्योंकि यह जानने का कोई तरीका नहीं है कि x! = 10 जब तक फ़ंक्शन कॉल स्थापित होने के बाद वास्तव में मूल्यांकन नहीं किया जाता है (जिसमें चर के लिए स्मृति आवंटित करना शामिल है)। –

1

कोई प्रदर्शन अंतर है, लेकिन तुम जाओ हो उन उदाहरणों में से प्रत्येक के बीच परिवर्तनीय दायरे के मुद्दों को खोजने के लिए आईएनजी।

  1. y और z अगर बयान के दायरे तक सीमित हैं:

    तुम भी उन उदाहरणों के बीच तीन अलग-अलग उद्देश्य है, जो नहीं है कि आप क्या चाहते दिखा रहे हैं।

  2. वाई और जेड अगर कथन के बाहर उपयोग किया जाता है, लेकिन सशर्त रूप से सेट हैं।

  3. वाई और जेड के पास अगर भी कथन के साथ कुछ लेना देना नहीं है।

+0

कोई प्रदर्शन अंतर क्यों नहीं है? एक और आईएल उत्पन्न करने के लिए – CJ7

0

मुझे नहीं लगता कि इससे काफी अंतर आएगा। केवल एक बार आपको चिंता करने की आवश्यकता होगी यदि नई वस्तु बनाना और इसे प्रारंभ करना महंगा है। आप किसी भी अंतर को देखने के लिए हमेशा कुछ हज़ार बार प्रोफाइल करने की कोशिश कर सकते हैं लेकिन मुझे संदेह है कि आपको कोई भी मिल जाएगा।

एकमात्र बार जब मैं इसका इस्तेमाल कहां से घोषित करता हूं, तो यह एक लूप में काम करेगा। उदाहरण:

void RunMethod() { 
    FormRepresentation formRep = null; 
    for (int idx = 0; idx < 10; idx++) { 
    formRep = new FormRepresentation(); 
    // do something 
    } 
} 

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

1

बेशक, आपको हमेशा एक चुनना चाहिए, यह बहुत अधिक पठनीय है। यह एक नैनोसेकंद के एक अंश से तेज़ है दुर्घटना नहीं है, अक्सर पढ़ने योग्य कोड है।

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