2012-04-13 14 views
11

मैं अक्सर इस तरह कोड लिखने:गणना और क्षमता कितनी तेज़ है?

if (list.Count > 0) { } 

इस कुशल है? की तरह इस आपरेशन दिखता है: सूची के माध्यम से और

  • दोहराएं उसके तत्वों गिनती
  • परिणाम: 986,000 तत्वों
  • 986,000 0 से अधिक है?
  • वापसी सच

या इस तरह:

  • सूची में तत्वों की संग्रहीत नंबर प्राप्त करें (986.000)
  • 986.000 0 से अधिक है?
  • वापसी सच

यही है, सूची में तत्वों की संख्या प्राप्त करने के लिए, आप सूची के माध्यम से सभी तरह से गिनती करने के लिए है, या तत्वों की संख्या कहीं दर्ज की गई है? और क्या यह सभी ICollection कक्षाओं के मामले में है?

सूची के Capacity के बारे में क्या?

उत्तर

33

मैं अक्सर इस तरह कोड लिखता हूं: if (list.Count > 0) { } क्या यह कुशल है?

हां। यह सूची में गिनती को पुनर्प्राप्त करता है, जो सूची के अंदर किसी फ़ील्ड में संग्रहीत होता है, और इसकी तुलना शून्य से करता है।

अब एक सवाल आप से पूछना नहीं किया:

if (sequence.Count() > 0) { } बारे में क्या? (ध्यान दें Count() पर कोष्ठकों।)

हम कार्यावधि में अनुक्रम पूछताछ अगर यह एक Count संपत्ति है कि कुशलता से गणना की जा सकती है कि एक सूची है देखने के लिए। अगर ऐसा होता है, तो हम इसे कहते हैं। यदि नहीं, तो हम एक ही समय में पूरे अनुक्रम को एक आइटम गिनते हैं, और फिर इसकी तुलना शून्य से करें।

क्या यह अविश्वसनीय रूप से अक्षम नहीं है?

हां।

और अधिक कुशल क्या होगा?

if (sequence.Any())

क्यों कि और अधिक कुशल है?

क्योंकि यह एक तत्व से अधिक पुनरावृत्त करने का प्रयास करता है। यदि यह सफल होता है, तो Any सत्य है; यदि यह विफल रहता है तो Any गलत है। शून्य से अधिक होने के लिए आपको जार में जेलीबीन की संख्या गिनने की आवश्यकता नहीं है। आपको केवल यह देखने की ज़रूरत है कि कम से कम एक है या नहीं।

काफी अधिक कुशल होने के अतिरिक्त, कोड अब कोड के इच्छित अर्थ की तरह पढ़ता है। यदि आप पूछना चाहते हैं "क्या सूची में कोई आइटम हैं?" फिर पूछें "क्या सूची में कोई आइटम हैं?" और नहीं "शून्य से अधिक सूची में आइटम की संख्या है?"

Capacity किसी सूची की संपत्ति के बारे में क्या?

यह आपको बताता है कि सूची के आंतरिक डेटा संरचनाओं में कितनी जगह आवंटित की गई है। यह अधिक मात्रा में आवंटित करने से पहले सूची स्टोर की जा सकती है।

+0

"हम रनटाइम पर अनुक्रम से पूछताछ करते हैं कि यह एक सूची है जिसमें एक गणना संपत्ति है जिसे कुशलता से गणना की जा सकती है।" उससे तुम्हारा क्या मतलब है? क्या आप 'गणना' नामक संपत्ति की जांच करते हैं, या आप जांचते हैं कि 'ICollection ' लागू किया गया है या नहीं? दूसरे में मजाकिया विशेष मामले हैं यदि आप 'IENumerable ' के कॉन्वर्स का उपयोग करते हैं। – CodesInChaos

+0

@CodeInChaos: गणना नाम की संपत्ति के लिए प्रतिबिंब के माध्यम से देखकर धीमा और अविश्वसनीय दोनों होगा। हम इंटरफ़ेस के कार्यान्वयन की तलाश करते हैं। और हां, आप कॉन्वर्सिस मुद्दों के परिणामस्वरूप झूठी नकारात्मकता प्राप्त कर सकते हैं। यदि ऐसा होता है तो यह दर्द होता है तो ऐसा न करें। –

+2

@CodeInChaos यदि 'ICollection 'की जांच विफल हो जाती है, तो कोड गैर-जेनेरिक' आईसीओलेक्शन' के लिए जांचता है। इसलिए अधिकांश ढांचे के संग्रह कोवर्सियन समस्या से सुरक्षित हैं। – phoog

2

इसके बजाय इस कोड का उपयोग करें: list.Any()। यह List<>.Count से धीमा हो सकता है, लेकिन किसी भी IENumerable <> के लिए सबसे प्रभावी तरीके से काम करेगा।

CapacityCount से ग्रेट किया जा सकता है। इसका उपयोग तब किया जाता है जब आप बाद में बहुत सारी चीज़ें जोड़ने की योजना बनाते हैं।

public int Count 
{ 
    get 
    { 
    return this._size; // this is a field 
    } 
} 
+2

जबकि 'कोई()' 'गणना()> 0' के लिए बेहतर है, यह थोड़ा कम कुशल है क्योंकि यह संग्रह पर एक गणनाकर्ता बनाता है। – Gabe

+0

फॉट सूची या कोई संग्रह जो सी –

2

गणना सूची O(1) ऑपरेशन है:

List.Count की Imlementation निम्नलिखित (यह वास्तव में हे है (1)) है।

यह सबसे तेज़ तरीका संभव है।

गणना: यह वास्तव में सूची में मौजूद कई तत्व मौजूद हैं।

capcity: बेहतर दस्तावेज़ीकरण की व्याख्या करता है:

हो जाता है या तत्वों आंतरिक डेटा संरचना आकार बदलने के बिना पकड़ सकता है की कुल संख्या निर्धारित करता है।

1

क्षमता आपको नहीं बताती है कि आपकी सूची में कितनी वस्तुएं हैं - बस सूची कितनी तैयार है।

MSDN से:

Capacity is the number of elements that the List<T> can store before resizing is required, while Count is the number of elements that are actually in the List<T>. 

List.Count सुपर तेज है और जबकि List.Count एक पहुँचा संपत्ति (है) IEnumerable से है और मेरा मानना ​​है कि सूची के माध्यम से एक पूरी गणना करने के लिए है।

6

List<T> में Count संपत्ति - और बीसीएल में अन्य सभी ICollection<T> कार्यान्वयन - एक हे (1) आपरेशन, यह तेजी से और सूची में तत्वों की संख्या की संख्या से स्वतंत्र है इसका मतलब है कि है।

एक विस्तार विधि भी मौजूद है Count() जिसे किसी भी IEnumerable<T> पर बुलाया जा सकता है। यह विधि ओ (एन) है, जिसका अर्थ है कि इसका रनटाइम संख्यात्मक तत्वों की संख्या पर निर्भर करता है। हालांकि, एक अपवाद है: यदि संख्यात्मक वास्तव में ICollection<T> या ICollection का कार्यान्वयन है तो यह Count संपत्ति का उपयोग करता है जो इसे फिर से ओ (1) ऑपरेशन बनाता है।


Capacity संपत्ति सामान्य रूप से आपको चिंता करने की आवश्यकता नहीं है।

+1

स्टोर करता है, ठीक है, इस बात पर विचार करते हुए कि ओप सूची में लगभग 9 86,000 तत्वों की बातचीत करता है, सही जगह पर क्षमता का एक चतुर प्रबंधन * महत्वपूर्ण लाभ ला सकता है। – Tigran

+0

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

+0

मेरा मतलब यह नहीं है: यह * कुछ स्थितियों में लाभ ला सकता है (उदाहरण सीएडी प्रोग्राम) – Tigran

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