2013-06-18 7 views
10

मुझे आश्चर्य है कि पता चल सके कि यह किसी भी फर्क नहीं पड़ता बनाम:प्रदर्शन: List.Count एक संग्रहीत चर

for (int i = 0; i < values.Count; i++) 
     { 
      // 
     } 

बनाम

int num = values.Count; 

for(int=0; i<num; i++) 
{ 

} 

मुझे लगता है कि क्योंकि आप की जरूरत नहीं है दूसरा दृष्टिकोण बेहतर है प्रत्येक पुनरावृत्ति में सभी वस्तुओं की गणना करें। लेकिन हो सकता है मैं गलत हूं। क्या कोई मुझे रोशन कर सकता है?

+6

एक सामान्य नियम के रूप में, यदि आप प्रदर्शन के बारे में सोच रहे हैं, तो आपको यह पता लगाने के लिए अपने ऐप को प्रोफाइल करना चाहिए कि बाधाएं कहां हैं। आधुनिक कंपाइलर ऑप्टिमाइज़ेशन पर बहुत अच्छा काम करते हैं और आमतौर पर बाधाएं नहीं होतीं, जहां कोई सोचता है कि वे हैं। _ प्रोग्रामिंग_ के अभ्यास में, ब्रायन कर्निघान बताते हैं कि बेल लैब्स के बहुत से स्मार्ट लोग गलत चीज़ को अनुकूलित करने के लिए कैसे समाप्त हुए। – David

+3

आपने दोनों तरीकों से कोड लिखा है। ** इसे दोनों तरीकों से चलाएं और फिर आपको पता चलेगा कि कौन सा तेज़ है **। इस समस्या को हल करने के लिए * विज्ञान * का प्रयोग करें, न कि * divination *। –

उत्तर

11

सूची पहले से ही अपने Count को आंतरिक रूप से संग्रहीत करती है। आप जो तुलना कर रहे हैं वह कोड शैली से संबंधित है, प्रदर्शन नहीं। चूंकि संकलक 'गणना' की बहाली को अनुकूलित करेंगे

+2

संकलक के लिए किसी अन्य ऑब्जेक्ट पर एक परिवर्तनीय संपत्ति 'गणना' के पुनर्प्राप्ति को अनुकूलित करने के लिए संभव नहीं है। अनुकूलित आईएल के साथ मेरे प्रयोग इंगित करते हैं कि प्रत्येक पुनरावृत्ति पर 'गणना' फिर से पढ़ी जाती है। – spender

+0

@ स्पेंडर आईएल को जेआईटी द्वारा बदला जा सकता है, जेआईटी द्वारा जेनरेट की गई अनुकूलित असेंबली को पढ़ने का प्रयास करें, यहां निर्देश दिए गए हैं: http://blogs.msdn.com/b/vancem/archive/2006/02/20/535807। एएसपीएक्स – Esailija

+0

मुझे विश्वास नहीं है कि जेआईटी एक अनुकूलन बनाने के लिए पर्याप्त चालाक है जिसके लिए यह जानना आवश्यक है कि सूची किसी अन्य धागे से छेड़छाड़ की जा रही है या नहीं। यह मेरे लिए कुछ महंगा लगता है। मैं अनुकूलित जेआईटी असेंबली पर एक नज़र डालेगा, लेकिन मैं यह देखने के लिए संघर्ष कर रहा हूं कि इसे कैसे अनुकूलित किया जा सकता है। – spender

3

यह पूरी तरह से values पर निर्भर करता है। Count इस ऑब्जेक्ट के प्रकार के आधार पर पूरी तरह से अलग-अलग लागू किया जा सकता है।

यदि आप एक सामान्य List<T> के बारे में बात कर रहे हैं - तो गणना को एक आंतरिक संपत्ति के रूप में कार्यान्वित किया जाता है जिसका पुनः मूल्यांकन नहीं किया जाता है - और इसलिए बेहतर विकल्प है।

8

वैसे आप यहाँ नेट स्रोत कोड http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs#aa7e01fcb80a917e

देख सकते हैं
public int Count { 
     get { 
      Contract.Ensures(Contract.Result<int>() >= 0); 
      return _size; 
     } 
    } 

ऐसा लगता है कि इस सूची में .Count संपत्ति एक त्वरित आंतरिक जांच करता है और फिर _ आकार बदलें। इसलिए यह आपके मूल्य को संग्रहीत करने के प्रदर्शन के बहुत करीब होना चाहिए।

+0

मैं इस +1 धन्यवाद के लिए सभी स्रोत दस्तावेज़ों को देख रहा था धन्यवाद – RadioSpace

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