2009-11-02 9 views
5

सूची 1 एक सॉर्टेडलिस्ट (MyClass का) है और इसमें 251 सदस्य हैं।एक सॉर्टेडलिस्ट के माध्यम से साइकिल चलाना - यह तेज़ क्यों है? निम्नलिखित उदाहरणों में

पहले दो कोडब्लॉक 15.5 सेकेंड में निष्पादित होते हैं।

For cnt As Integer = 1 To 1000000 
     For Each TempDE In List1 
      Dim F As String = TempDE.Key 
      TempDE.Value.x1 = 444 
     Next 
    Next 

 

For cnt As Integer = 1 To 1000000 
     For Each TempDE As KeyValuePair(Of String, phatob) In List2 
      Dim F As String = TempDE.Key 
      TempDE.Value.x1 = 444 
     Next 
    Next 

यह एक 5.6 सेकंड में निष्पादित करता है।

For cnt As Integer = 0 To 999999 
     For cnt2 As Integer = 0 To 250 
      Dim F As String = List1.Keys(cnt2) 
      List1.Values(cnt2).x1 = 444 
     Next 

    Next 

क्यों इतना धीमी पहले दो codeblocks कर रहे हैं?

+0

सुनिश्चित नहीं है लेकिन शायद प्रत्येक लूप के लिए पूर्णांक पर फॉर लूप की तुलना में एक बड़ा ओवरहेड है। इस प्रकार दूसरी पंक्ति speedup के लिए जिम्मेदार हो सकता है? मैं वास्तव में नहीं जानता। –

+0

क्या पहले दो लूप 15.5 सेकेंड एक साथ लेते हैं, या हर? – Artelius

+0

@Artelius - प्रत्येक –

उत्तर

4

सॉर्टेडलिस्ट सॉर्ट कार्यक्षमता प्रदान करने के लिए आईसीओएमपेयर को लागू करके एक संग्रह बढ़ाता है। आंतरिक रूप से, यह सूची के तत्वों को संग्रहीत करने के लिए 2 सरणी लागू करता है - कुंजी के लिए एक सरणी और मानों के लिए एक। .NET Array को तेज़ इन-ऑर्डर और तेज़ यादृच्छिक पहुंच के लिए अनुकूलित किया गया है।

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

+0

यह एक बेहतर संस्करण है जहां मैं अपने उत्तर के साथ प्राप्त करने की कोशिश कर रहा था :) – Zwergner

3

मैंने कुछ दस्तावेज के लिए चारों ओर देखने की कोशिश की कि कैसे For Each व्यवहार करता है, लेकिन मुझे यह नहीं मिला।

मेरे सिद्धांत है कि For Each बयान प्रतियां स्मृति में एक और जगह पर सूची में वस्तु और फिर प्रतियां का उपयोग कर इसे सूची में वापस पाश से प्रत्येक यात्रा समाप्त होता है जब है।

एक और संभावना यह है कि यह प्रत्येक पुनरावृत्ति की शुरुआत में निर्माता को कॉल करता है और फिर deconstructs और अगले पुनरावृत्ति के लिए पुन: स्थापित करने के लिए निर्माता को फिर से कॉल करता है।

मुझे इनमें से किसी भी सिद्धांत पर यकीन नहीं है, लेकिन 3 और (1 या 2) के बीच बड़ा अंतर For Each की कमी है।

संपादित करें: MSDN पर कुछ दस्तावेज मिला।

जब के निष्पादन प्रत्येक ... अगला पाश के लिए शुरू होता है, विजुअल बेसिक पुष्टि करता है कि समूह मान्य संग्रह वस्तु को दर्शाता है:

यहाँ एक अंश है। यदि नहीं, तो यह एक अपवाद फेंकता है। अन्यथा, यह पहले तत्व को वापस करने के लिए MoveNext विधि और गणनाकर्ता ऑब्जेक्ट की वर्तमान प्रॉपर्टी को कॉल करता है। यदि MoveNext इंगित करता है कि कोई अगला तत्व नहीं है, यानी, यदि संग्रह खाली है, तो प्रत्येक लूप समाप्त हो जाता है और अगला कथन के बाद कथन को नियंत्रित करता है। अन्यथा, विजुअल बेसिक तत्व को पहले तत्व में सेट करता है और कथन ब्लॉक चलाता है।

तो कुल मिलाकर यह लग रहा For Each की तरह है और अधिक "प्रबंधित" और यह सुनिश्चित करें सब कुछ मेल खाता बनाने के लिए भूमि के ऊपर का एक बहुत है। नतीजतन, यह धीमा है।

3

मुझे लगता है कि संकलक निश्चित लूप रेंज के कारण ब्लॉक 3 को बेहतर अनुकूलित कर सकता है। एक और 2 ब्लॉक में संकलक को पता नहीं चलेगा कि लूप की ऊपरी सीमा तब तक है जब तक यह सूची का मूल्यांकन न करे जिससे इसे धीमा कर दिया जाए।

+0

निश्चित रूप से एक वैध बिंदु। मुझे लगता है कि यह योगदान देता है, लेकिन शायद पूरी समस्या नहीं है। – Zwergner

2

मेरा यादृच्छिक अनुमान: सूची 1 में ~ 750 तत्व हैं (और केवल 250 नहीं)। आपका तीसरा मामला तेज़ है, क्योंकि यह सूची 1 के प्रत्येक तत्व पर पुनरावृत्ति नहीं करता है।

+0

अब मैं इसे सही उत्तर के रूप में झुका रहा हूं, क्योंकि मेरे स्वयं के परीक्षण नियमित रूप से पुनरावृत्ति के समान गति के बारे में 'प्रत्येक के लिए' दिखाते हैं। इस दावे का और समर्थन करने के लिए, आप त्रुटि के बिना 251 से अधिक तत्व (0 से 250) को फिर से शुरू कर रहे हैं, इसलिए सूची में आपके द्वारा किए जाने वाले तत्वों की संख्या शामिल नहीं है। – Zwergner

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