2013-07-18 14 views
5

एक प्रोजेक्ट पर काम करते समय मैं कोड के निम्नलिखित भाग में भाग गया, जिसने प्रदर्शन ध्वज उठाया।foreach loop सूची प्रदर्शन अंतर

foreach (var sample in List.Where(x => !x.Value.Equals("Not Reviewed"))) 
{ 
    //do other work here 
    count++; 
} 

मैं निम्नलिखित पाश करने के लिए मूल पाश की तुलना त्वरित परीक्षण के एक जोड़े चलाने का फैसला किया:

foreach (var sample in List) 
{ 
    if (!sample.Value.Equals("Not Reviewed")) 
    { 
     //do other work here 
     count++; 
    } 
} 

और भी में इस पाश फेंक दिया देखने के लिए कि क्या होता है:

var tempList = List.Where(x => !x.Value.Equals("Not Reviewed")); 
foreach (var sample in tempList) 
{ 
    //do other work here 
    count++; 
} 

मैंने मूल सूची को 3 अलग-अलग तरीकों से भी पॉप्युलेट किया: 50-50 (इसलिए मूल्यों का 50% जहां "समीक्षा नहीं की गई" और शेष अन्य), 10-90 और 9 0-10। ये मेरे परिणाम हैं, पहले और आखिरी लूप अधिकतर समान हैं लेकिन दूसरा एक बहुत तेज है, खासकर 10-90 मामले पर। बिल्कुल क्यों? मैंने हमेशा सोचा Lambda अच्छा प्रदर्शन था।

संपादित

count++ वास्तव में नहीं है क्या है पाश अंदर, मैं सिर्फ इतना है कि यहां प्रदर्शन के उद्देश्य से कहा, मुझे लगता है मैं का उपयोग किया है चाहिए "// यहाँ कुछ करना"

लगता है Performance Results

संपादित 2

परिणाम हर एक 1000 बार चल रहा है: Performance Results 1000 times

+2

यह देखना दिलचस्प होगा कि कैसे 'सूची। जहां (x =>! X.Value.Equals ("समीक्षा नहीं की गई"))। गणना() 'उन लोगों की तुलना में प्रदर्शन करती है। –

+11

@ माइकप्रैकअप: या इससे भी बेहतर, 'List.Count (x =>! X.Value.Equals ("समीक्षा नहीं की गई")) ' –

+1

क्या आपने यह सुनिश्चित किया है कि आपने इनमें से कोई भी [प्रदर्शन बेंचमार्क गलतियों] (http : //tech.pro/blog/1293/c-performance-benchmark-mistakes-part-one)? – Corak

उत्तर

9

मूल रूप से, वहाँ अतिरिक्त अविवेक की एक छोटी राशि है - दोनों एक प्रतिनिधि के माध्यम से परीक्षण के लिए है, और बार-बार दोहराना भाग के लिए। यह देखते हुए कि प्रति पुनरावृत्ति कितनी कम काम की जा रही है, यह अतिरिक्त संकेत अपेक्षाकृत महंगा है।

यह मेरे विचार में न तो आश्चर्यजनक और चिंताजनक है। यह माइक्रो-ऑप्टिमाइज़ेशन का प्रकार है जिसे आप आसानी से कर सकते हैं यदि आप अपने असली दुनिया के अनुप्रयोग में महत्वपूर्ण होने की दुर्लभ स्थिति में हैं। मेरे अनुभव में इस तरह के लूप के लिए ऐप में एक महत्वपूर्ण बाधा बनना बहुत दुर्लभ है।सामान्य दृष्टिकोण होना चाहिए:

  • परिभाषित प्रदर्शन की आवश्यकताओं
  • लागू स्पष्ट, सबसे आसान तरीका में कार्यात्मक जरूरतों आप
  • आवश्यकताओं के खिलाफ अपने प्रदर्शन का आकलन करें
  • प्रदर्शन चाहने पाया जाता है, यही कारण है कि जाँच कर सकते हैं और केवल उतना ही स्पष्टता से दूर चले जाओ जितना आप कर सकते हैं,
  • जब तक आप पूरा नहीं कर लेते हैं तब तक दोहराएं

एक संपादन के जवाब:

गिनती ++ वास्तव में क्या पाश अंदर नहीं है, मैं सिर्फ जोड़ा यहां प्रदर्शन के उद्देश्य से, मैं मैं का उपयोग किया है चाहिए "// यहाँ कुछ करना"

लगता है कि

वैसे यह महत्वपूर्ण बात है - जितना अधिक काम किया जाता है, उतना ही कम महत्वपूर्ण होगा। बस गिनती बहुत तेज है, इसलिए मैं एक बड़ी विसंगति देखने की उम्मीद करता हूं। वास्तविक काम की कोई भी राशि करें, और अंतर छोटा होगा।

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