2012-10-30 65 views
2

問題1:最大程度地利用.NET任務並行庫

是使用的Parallel.For和Parallel.ForEach更適合的與被有序或無序任務的工作?

我問的原因是我最近更新了一個串行循環,其中一個StringBuilder被用來根據各種參數生成一條SQL語句。結果是,與使用標準的foreach循環相比,SQL有點混亂(到它包含語法錯誤的地步),因此我的直覺是TPL不適合執行數據必須出現在特定的順序。

問題2:

是否TPL自動使用之前執行必須提供我任何的多核架構?

我問這個問題的原因與我詢問的有關第三方物流運營績效分析的問題有關。對這個問題的回答讓我意識到TPL並不總是比標準串行循環更高效,因爲應用程序可能無法訪問多個內核,因此創建額外線程和循環的開銷會導致性能比較下降到標準的串行循環。

+6

如果你有兩個問題,也許你應該張貼兩個問題:) –

回答

2

我的直覺是,TPL不適合執行數據必須以特定順序出現的任務。

正確。如果你期望事物的順序,你可能會誤解當你「循環」一個循環時會發生什麼。

TPL自動使用多核體系結構,必須在執行之前提供任何東西嗎?

請參閱MSDN雜誌下面的文章: http://msdn.microsoft.com/en-us/magazine/cc163340.aspx

使用庫,您可以方便地表達潛在的並行 在現有的順序代碼,其中暴露的並行任務將是 同時運行在所有可用處理器。

0

在第1點,如果使用TPL,則不知道按哪個順序運行哪個任務。這是並行vs順序的美妙之處。有辦法控制事物的順序,但是你可能會失去並行的好處。

2:TPL開箱即用多核。但是在使用多線程的時候確實總是有開銷。調度器上的加載增加,線程(上下文)切換不是免費的。要保持數據同步以避免競爭條件,您可能需要一些鎖定機制,這也會增加開銷。

使用TPL製作快速並行算法變得容易很多,但仍然是某種藝術。

1
  1. 如果結果必須然後命令你並行,你需要能夠做的實際工作以任意順序,然後對結果進行排序的循環。取決於具體情況,這可能會或可能不會比首先連續進行工作更有效。如果以任何順序完成工作並行化的好處超過了訂購結果的成本,那麼這是一個淨收益。如果這個任務不夠複雜,那麼你的硬件不允許進行很多並行化,或者如果它不能很好地並行化(即由於數據依賴性你有很多等待),那麼排序結果可能需要更多比平行化循環所獲得的時間要少(或者更糟的是,即使沒有排序,平行化循環也需要更長的時間,參見問題二),所以你不應該並行化它。

    請注意,如果實際的工作單元需要按照某個順序運行,而不是僅僅需要某個順序的結果,那麼您將無法並行化它,否則您將不會能夠幾乎有效地並行化它。如果你沒有正確地同步訪問共享資源,那麼你最終會得到錯誤的結果(就像你的情況那樣)。爲此,您需要記住,如果您無法真正拿出正確的結果,性能優化就毫無意義。

  2. 您不需要太擔心TPL的硬件問題。您不需要明確添加或限制任務。雖然有幾種方法可以讓你可以,幾乎在任何時候你做這樣的事情,你都會損害性能。當你做這樣的事情時,你是加上限制TPL,所以它不能做它想做的事情。它通常比你更清楚。

    你也在這裏觸及另一個問題,那就是並行化一個循環通常需要的時間比沒有(你只是沒有給出可能的原因導致這種行爲)。通常,需要完成的實際工作只是非常小,非常小,以至於創建線程,管理它們,處理上下文轉換以及根據需要同步數據的工作可能比通過並行執行某些工作而獲得的工作更多。這就是爲什麼在確定並行化一些工作以確保實際上從中受益時真正進行大量測試的重要性。

0
  1. 這不是更好更糟的無序列表 - 你在#1問題是,你有一個共享依賴於StringBuilder這就是爲什麼並行查詢失敗。 TPL在獨立工作單位奇妙地工作。即便如此,仍然有一些簡單的技巧可用於強制對並行查詢進行評估,並在並行操作全部完成時保持結果的原始排序。

  2. TPL和PLINQ在技術上是截然不同的東西; PLINQ使用TPL來實現它的目標。也就是說,PLINQ試圖檢查你的體系結構並儘可能地構建組的執行。 TPL僅僅是任務架構的包裝。要決定創建任務的開銷(類似於1MB的內存)以及執行任務的上下文切換的開銷是否大於只是簡單地串行運行任務。

+0

創建任務只是「1 MB」的內存,如果底層的線程池決定創建一個新的線程,它不該」經常(如果有的話),因爲正如名字所暗示的那樣,它可以保留一堆線程。但是創建一個新的任務實例並且是非常不相關的,你不應該回避創建一個新任務。 – JulianR

0

很明顯,TPL並不是構建查詢之類有序集合的好工具。

如果您有一系列要在項目集上執行的任務,則可以使用BlockingCollection。這些任務可以並行執行,但是集合的順序將保持不變。

BlockingCollection Class