2010-02-16 16 views
18

ParallelEnumerable में एक स्थिर सदस्य AsParallel है। अगर मेरे पास IEnumerable<T> है और Parallel.ForEach का उपयोग करना चाहते हैं तो यह दर्शाता है कि मुझे हमेशा AsParallel का उपयोग करना चाहिए?समानांतर करता है। फोरेच के लिए AsParallel()

उदा। क्या ये दोनों सही हैं (बाकी सबकुछ बराबर है)?

AsParallel बिना

:

List<string> list = new List<string>(); 
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f)); 

या AsParallel साथ?

List<string> list = new List<string>(); 
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f)); 

उत्तर

21

यह कहता है कि क्या कहा जा रहा है, वे अलग-अलग मुद्दे हैं।

.AsParallel()गणना समानांतर कार्यों का प्रतिनिधिमंडल समानांतर करता है।

Parallel.ForEachलूप समांतर, प्रत्येक तत्व के लिए कार्यकर्ता धागे को कार्य सौंपा गया।

तब तक जब तक आपका स्रोत गणना समांतर बनने से लाभ न हो (उदा। reader.Match(file) महंगा है), वे बराबर हैं। आपके अंतिम प्रश्न के लिए, हाँ, दोनों भी सही हैं।

इसके अलावा

, वहाँ एक अन्य निर्माण आपको लगता है कि यह थोड़ा छोटा कर देता पर, अभी भी PLINQ का अधिकतम लाभ मिल रहा है देखने के लिए चाहते हो सकता है है:

GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f)); 
+2

हममम ... वास्तव में क्या गणन parrallelizing है? या कम से कम उस समांतरता को कार्य प्रतिनिधिमंडल से अलग कैसे किया जा सकता है? – dkackman

+2

@dkackman '.ssarallel()' समानांतर निष्पादन के लिए संख्या को तैयार करता है, विशेष रूप से इस मामले में 'चयन करें()' के समानांतर संस्करण। एक ऐसी गणना के बारे में सोचें जिसमें एक विशाल 'कहां' खंड है लेकिन कोई आदेश नहीं है, हम मूल्यांकन कर सकते हैं कि अगले कोर के साथ-साथ धारा को अगले उपलब्ध थ्रेड पर गणना करने के बाद जितना संभव हो सके, इसे लगभग 'n' बार तेज बना दिया जाए। हम उस परिणाम के साथ क्या करते हैं, उसी तरह बाद में, एक थ्रेड में सिंक्रनाइज़ रूप से या कोर के रूप में फैले हुए समेकित तरीके से भी संभाला जा सकता है, यह 'समांतर' फॉरएच 'या' फॉरएल 'भाग है, समझ में आता है? –

+0

यह समझ में आता है। धन्यवाद निक। – dkackman

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