2012-09-27 32 views
15

我有一些代碼,我目前正在優化多核架構中的併發。在我的一個類中,我找到了一個嵌套的foreach循環。基本上,外循環遍歷一組NetworkInterface對象。內部循環通過網絡接口IP地址進行迭代。嵌套的Parallel.ForEach循環

這讓我想到,有嵌套Parallel.ForEach循環必然是一個好主意?閱讀這篇文章(Nested Parallel.ForEach Loops on the same list?)後,我仍然不確定什麼適用於效率和並行設計方面。此示例將大約Parallel.Foreach條語句應用於兩個循環都在該列表上執行操作的列表。

在我的例子中,迴路做不同的事情,所以,我應該:

  1. 使用嵌套循環Parallel.ForEach?
  2. 用戶Parallel.ForEach在父循環並保持內部循環原樣?
+2

您可以使用秒錶測試解決方案嗎?然後你會知道它是否值得。 – mike00

回答

19

Parallel.ForEach不一定並行執行 - 如果可能的話,這只是一個請求。因此,如果執行環境沒有CPU能力來並行執行循環,則不會這樣做。

如果在循環中的動作都沒有關係(即,如果它們是獨立的,不互相影響),我看到使用Parallel.ForEach無論在內環和外環沒有問題。

這實際上取決於執行環境。如果您的測試環境與生產環境相似,則可以進行時間測試,然後確定要執行的操作。當有疑問時,測試;-)

祝你好運!

+0

不能不同意。是的,Parallel.Foreach背後的調度程序可能不會產生單獨的線程,但是您會花費更多的線程或調度程序的開銷,而無需使用任何科學數據進行備份。 –

+2

@MAfifi:請再讀一遍我的答案。 –

+0

更好的回答;) –

3

答案是肯定的,

  1. 一旦你擁有IP地址,你在做什麼?
  2. 每一步需要多長時間?

線程並不便宜,它們需要時間來創建,並且內存要存在。如果你沒有使用這些IP地址在計算上花費大量費用,並且使用錯誤類型的集合進行併發訪問,那麼幾乎肯定會減慢應用程序的運行速度。

使用StopWatch可以幫助您回答這些問題。

+2

創建線程很昂貴,這正是爲什麼'Parallel.ForEach()'使用'ThreadPool',所以創建新線程很可能不會成爲問題。 – svick