2012-09-27 14 views
15

मैं कुछ कोड है जो मैं वर्तमान में मल्टीकोर आर्किटेक्चर में संगामिति के लिए अनुकूलन कर रहा हूँ है लूप। मेरी कक्षाओं में से एक में, मुझे एक नेस्टेड foreach पाश मिला। असल में बाहरी पाश NetworkInterface वस्तुओं की एक सरणी के माध्यम से पुनरावृत्त करता है। आंतरिक लूप पुनरावृत्त करता है हालांकि नेटवर्क आईपी पते को इंटरफेस करता है।नेस्टेड Parallel.ForEach

यह मुझे सोच कर ली, Parallel.ForEach छोरों जरूरी नेस्ट होने है एक अच्छा विचार है? इस आलेख को पढ़ने के बाद (Nested Parallel.ForEach Loops on the same list?) मैं अभी भी अनिश्चित हूं कि दक्षता और समांतर डिजाइन के संदर्भ में कहां लागू होता है। इस उदाहरण में Parallel.Foreach कथन एक सूची में लागू किए जा रहे हैं जहां दोनों लूप उस सूची पर संचालन कर रहे हैं।

मेरे उदाहरण में, छोरों अलग अलग बातें कर रहे हैं, इसलिए, चाहिए मैं:

  1. उपयोग नेस्टेड Parallel.ForEach छोरों?
  2. उपयोगकर्ता समानांतर। पैरेंट लूप पर प्रत्येक के अंदर और आंतरिक लूप को छोड़ दें?
+2

क्या आप स्टॉपवॉच का उपयोग करके समाधान का परीक्षण कर सकते हैं? फिर आपको पता चलेगा कि यह लायक है या नहीं। – mike00

उत्तर

19

एक Parallel.ForEach जरूरी समानांतर में निष्पादित नहीं करता है - यह तो यदि संभव हो तो ऐसा करने के लिए सिर्फ एक अनुरोध है। इसलिए, अगर निष्पादन वातावरण में समानांतर में लूप को निष्पादित करने के लिए CPU शक्ति नहीं है, तो ऐसा नहीं होगा।

यदि लूप पर कार्य संबंधित नहीं हैं (यानी, यदि वे अलग हैं और एक-दूसरे को प्रभावित नहीं करते हैं), तो मुझे समानांतर का उपयोग करने में कोई समस्या नहीं दिखाई देती है। दोनों आंतरिक और बाहरी लूपों के लिए।

यह वास्तव में निष्पादन पर्यावरण पर निर्भर करता है। यदि आपका परीक्षण वातावरण उत्पादन वातावरण के लिए पर्याप्त है, तो आप समय परीक्षण कर सकते हैं, और फिर निर्धारित करें कि क्या करना है। संदेह होने पर, परीक्षण ;-)

गुड लक!

+0

अधिक असहमत नहीं हो सका। हां समानांतर के पीछे शेड्यूलर। Foreach अलग धागे से बाहर नहीं हो सकता है, लेकिन आप धागे, या एक शेड्यूलर के बहुत अधिक ओवरहेड के माध्यम से कूद रहे हैं बिना किसी वैज्ञानिक डेटा के इसे वापस करने के लिए। –

+2

@MAfifi: कृपया मेरा उत्तर दोबारा पढ़ें। –

+0

बेहतर उत्तर;) –

3

जवाब हो जाएगा, यह निर्भर करता है;

  1. आईपी पते के साथ आप क्या कर रहे हैं?
  2. प्रत्येक चरण में कितना समय लगता है?

धागे सस्ते नहीं हैं, वे बनाने के लिए समय लेते हैं, और स्मृति मौजूद हैं। यदि आप उन आईपी पते के साथ कम्प्यूटेशनल रूप से महंगा नहीं कर रहे हैं, और समवर्ती पहुंच के लिए गलत प्रकार के संग्रह का उपयोग कर रहे हैं, तो आप लगभग निश्चित रूप से अपने आवेदन को धीमा कर रहे हैं।

उपयोग StopWatch आप इन सवालों के जवाब में मदद करेगा।

+2

धागे बनाने के लिए महंगे हैं, यही कारण है कि 'समानांतर। फॉरएच() '' थ्रेडपूल' का उपयोग करता है, इसलिए नए थ्रेड बनाने की संभावना सबसे अधिक समस्या नहीं होगी। – svick

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