2010-08-09 13 views
7

मैं लगभग 1000 तत्वों के साथ एक अनाम प्रकार पर पुनरावृत्ति कर रहा हूं।linq foreach प्रदर्शन

यहां सवाल यह है कि यह संभव है कि मेरे लूप को पूरा होने में लगभग 3 सेकंड लगते हैं जबकि लूप के अंदर क्या होता है 1 एमएस से कम होता है। एक हज़ार तत्वों के साथ मुझे लगता है कि लूप को दूसरे के भीतर खत्म होना चाहिए, न कि 3.

क्या इसे तेज़ी से तेज करने का कोई तरीका है?

// takes 1ms to complete 
     var x = tt.Where(p => p.Methods.Count() > 0 && p.PerWeek != this.Project.WorkDaysCount && !p.IsManual); 

// takes almost 3 seconds to complete 
        foreach (var item in x) 
        { 
         // do stuff that takes < 1 ms 
        } 

उत्तर

14

लिंकक देरी निष्पादन का उपयोग करता है। आपकी linq क्वेरी वास्तव में निष्पादित नहीं होती है जब तक कि कोई व्यक्ति वापस आईनेमरेबल का उपयोग नहीं करता है। निष्पादन समय जो आप देख रहे हैं वह क्वेरी का परिणाम है, न कि foreach।

+0

संभोग नहीं करते। मुझे एहसास नहीं हुआ। धन्यवाद। – Jeroen

7

यह स्थगित निष्पादन है। x.ToList(); लिखें और इसमें ~ 3 सेकंड भी लगेंगे।

15

दो तत्काल सुझाव:

  • p.Methods.Count() > 0 का प्रयोग न करें - एक पूर्ण गिनती प्रदर्शन करने की जरूरत है कि, भले ही आप केवल पता करने के लिए अगर कोई तत्व हैं की जरूरत है। इसके बजाय p.Methods.Any() का उपयोग करें।
  • प्रत्येक पुनरावृत्ति पर this.Project.WorkDaysCount की गणना न करें। हम वहां क्या हो रहा है के बारे में जानकारी नहीं जानते हैं, लेकिन यह महंगा हो सकता है। इसे प्रीकंप्यूट करें, और निरंतर उपयोग करें।

यहाँ बेहतर क्वेरी कोड है:

int workDaysCount = Project.WorkDaysCount; 
var x = tt.Where(p => p.Methods.Any() && 
       p.PerWeek != workDaysCount && 
       !p.IsManual); 

के रूप में अन्य लोगों ने कहा, कारण क्वेरी निर्माण ही किसी भी महत्वपूर्ण समय है कि यह किसी भी असली काम नहीं कर रहा है है नहीं लेता है। हालांकि, जानते हुए भी कि यह किसी भी तेजी से नहीं है, ज़ाहिर है :)

इसके अलावा, हम संदर्भ के बारे में अधिक जानने की जरूरत जा रहे हैं। क्या यह LINQ ऑब्जेक्ट्स, LINQ से SQL, या कुछ और है? tt का प्रकार क्या है?

+0

यह काफी जटिल मॉड्यूल का हिस्सा है। टीटी द्वारा एक समूह का नतीजा है और बनाता है कुछ मानदंडों के आधार पर एक उप संग्रह .Methods। यह वस्तुओं के लिए LINQ है। आपकी जानकारी के आधार पर मैं मैं आगे अनुकूलन कर सकते हैं लगता है। धन्यवाद! – Jeroen

1

आपका आईनेमरेबल (एक्स) का मूल्यांकन तब तक नहीं किया जाएगा जब तक आप इसे

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