2016-12-01 9 views
7

मैं .NET में ExpressionVisitor के माध्यम से खुदाई कर रहा है और मैं इस for पाश पाया में हालत के लिए पाश चर घोषणा के लिए,नेट स्रोत कोड

for (int i = 0, n = nodes.Count; i < n; i++) 
{ 
    Expression node = Visit(nodes[i]); 
    if (newNodes != null) 
    { 
     newNodes[i] = node; 
    } 
    else if (!object.ReferenceEquals(node, nodes[i])) 
    { 
     newNodes = new Expression[n]; 
     for (int j = 0; j < i; j++) 
     { 
      newNodes[j] = nodes[j]; 
     } 
     newNodes[i] = node; 
    } 
} 

अब कोई विशेष कारण नहीं है यही कारण है कि है?

क्या इस से कोई प्रदर्शन लाभ है जो i = 0; i < nodes.Count में नहीं है?

+1

इस लूप एन में भी प्रयोग किया जाता है और शुरुआत में केवल एक बार नोड की गिनती की गणना करने के लिए और प्रत्येक पुनरावृत्ति पर नहीं, मुझे लगता है कि यह बेहतर तरीका है। –

उत्तर

11

जब आप एक ही कथन का उपयोग एक से अधिक बार करते हैं तो एक चर का उपयोग करना सबसे अच्छा अभ्यास है।

यहां, nodes.Count का उपयोग नीचे दो स्थानों में किया जाता है और इसलिए, एक ही कथन को दो बार निष्पादित करने के बजाय चर का उपयोग किया जाता था।

for (int i = 0, n = nodes.Count; i < n; i++) { 

और,

newNodes = new Expression[n]; 

नोट: के रूप में टिप्पणी में चर्चा की, प्रदर्शन अंतर हालांकि पूरी तरह से नगण्य है।

+0

जबकि आप गलत नहीं हैं, मुझे लगता है कि इस मामले में प्रदर्शन अंतर पूरी तरह से नगण्य है। – Abion47

+3

@ Abion47 यह निर्भर करता है कि गणना संपत्ति में क्या हो रहा है। यदि प्रत्येक कॉल पर तत्वों की गणना की जाती है तो यह नगण्य नहीं है, अगर संपत्ति वैश्विक चर लौटाती है जिसे गणना की गई थी तो वस्तु के निर्माण पर गिनती नगण्य है। उदाहरण के लिए सूची गिनती के साथ आपको कोई समस्या नहीं है। – mybirthname

+0

@ Abion47 हाँ आप सही हैं :-)। यह एक कोड सर्वोत्तम अभ्यास है ताकि यदि आप नोड्स का नाम बदलते हैं, तो आपको कई स्थानों पर इसका नाम बदलने की आवश्यकता नहीं है, हालांकि विजुअल स्टूडियो आपके लिए यह करेगा। यदि आप सीधे 'स्रोत गिटहब' और 'बिटबकेट' जैसे स्रोत नियंत्रण में इसे संपादित करते हैं तो क्या होगा। – Aruna

2

मुझे नहीं लगता कि इस मामले में इसका कोई प्रदर्शन प्रभाव पड़ता है। लेकिन के रूप में वे इस n उपयोग कर रहे हैं इस लाइन के साथ-साथ,

newNodes = new Expression[n];

तो

  • कार्यक्रम केवल एक बार node.Count प्राप्त करने के लिए है,।
  • n को फिर से असाइन करने की आवश्यकता नहीं है।
  • बहुत साफ दिखता है।

यह सब कुछ है।

+0

यदि कोई लूप के प्रत्येक पुनरावृत्ति पर गणना करने के बजाय node.count की गणना करता है तो इसका कोई प्रदर्शन प्रभाव नहीं होता है ??? –

+0

वे प्रारंभिक स्थितियां हैं, उन्हें केवल एक बार निष्पादित किया जाता है। यह प्रत्येक लूप के लिए 'i = 0' सेट नहीं करेगा। – Prajwal

+0

मुझे पता है और कहा, और जैसा कि आपने कहा "मुझे नहीं लगता कि इसका कोई प्रदर्शन प्रभाव है।" लेकिन यह प्रदर्शन प्रभाव है कि गिनती प्रत्येक पुनरावृत्ति पर गणना करने के बजाय केवल एक बार गणना कर रही है यदि लूप केवल i = 0 के साथ लिखा गया था; मैं

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