2016-09-17 44 views
-1

我有一些代碼試圖並行執行一個操作。爲什麼AsParallel().ForAll似乎沒有充分利用我的操作的CPU使用率?

的代碼基本上是

items 
     .AsParallel() 
     .ForAll(item => 
     { 
      DoWork(item); 
     }); 

項目是2500分的事情要處理的列表。 DoWork()是完全沒有IO的100%CPU計算。它大約需要1秒,但可能會有所不同。

我看到的問題是所有核心正在使用,但他們幾乎沒有被使用。我認爲這是與工作本身有關,所以我嘗試了下面的代碼並得到了相同的結果。

items 
     .Batches(10) 
     .AsParallel() 
     .ForAll(batch => 
     { 
      foreach(var item in batch) 
      { 
      DoWork(item); 
      } 
     }); 

我想利用率在80%附近,但對於我的生活我無法在那裏得到它。不知道該怎麼辦。

我試過Parallel.ForEach沒有運氣。嘗試.WithDegreeOfParallelism(Environment.ProcessorCount * 2)沒有運氣。

不知道接下來要嘗試什麼。

CPU utilization

+1

AsParallel()。ForAll沒有全部使用...全部是什麼? –

+0

99%您的'DoWork'實際上會以所有其他方式安排回UI線程或阻止線程。請提供真實的[MCVE]。 –

+0

它實際上是一個Windows服務,所以沒有用戶界面。我不認爲有任何封鎖。 – Telavian

回答

0

itemsIEnumerable? 如果是這樣,您可能遇到分區不佳的情況。嘗試包裝(或傳遞)作爲IList<T>List<T>

+0

他們是一名IList。 – Telavian

0

這些項目是動態構建/計算還是懶惰? 也許這些項目的(順序)來源不能足夠快地提供它們來使並行性有利可圖。

+0

他們不是。我開始認爲它與物理機器本身有關。 – Telavian

相關問題