2016-10-11 30 views
0

這裏是我的示例項目:在C#中使用AsParallel沒有好處?

 Console.WriteLine("Elapsed time in milliseconds:"); 

     swSingle.Start(); 
     var numbers2 = Enumerable.Range(0, 100000000); 
     var singleResult = numbers2 
      .Where(i => i % 2 == 0) 
      .ToArray(); 
     swSingle.Stop();  
     Console.WriteLine("Without AsParallel: {0}", swSingle.ElapsedMilliseconds); 

     swParallel.Start(); 
     var numbers = Enumerable.Range(0, 100000000); 
     var parallelResult = numbers.AsParallel() 
      .Where(i => i % 2 == 0) 
      .ToArray(); 
     swParallel.Stop(); 
     Console.WriteLine("Using AsParallel: {0}", swParallel.ElapsedMilliseconds); 

我(多核)系統的輸出是:

Elapsed time in milliseconds: 
Without AsParallel: 1537 
Using AsParallel: 2135 

爲什麼鴕鳥政策我使用AsParallel已得到這個樣本 在時間上的優勢?更糟的是,似乎 會有很多開銷。

+3

'i%2'的計算是一個太簡單的並行化用例。這需要更多的努力來管理任務並行,然後計算結果。 – fubo

+1

更準確地說,'.AsParallel'並不是魔術般的塵埃,它使一切都變得更快。它有成本。你應該只使用它,然後利益大於成本。更準確地說,每個並行化都有一個小的開銷,在你的情況下,比計算本身要大得多。 – Aron

+0

你可能想看看分區器。 _「[一般來說,範圍分區只有在代理的執行時間小到中等,並且源有大量元素,並且每個分區的總體工作大致相等時纔會更快](https:// msdn .microsoft.com/EN-US /庫/ dd997411.aspx)「_。即便如此,你的例子也是非常基本的 – MickyD

回答

4

只需要更多時間讓您的代碼並行運行(創建任務,計劃並運行它),而不是通過並行執行代碼獲得的優勢。

這就是說,這並不是每一個並行運行的代碼的好處。您只能在具有較高CPU負載或外部I/O的實質代碼段(如HTTP請求)上使用它。

1

模操作需要O(1)次,因爲它被認爲是一個簡單的操作。使用Linq,你會得到O(n)的複雜性(你實際上循環了所有事情),但這並不複雜。

當你用.AsParallel運行你的func時,你只需在你的動作中增加更多的開銷。

嘗試處理實際需要多個CPU內核的更復雜的功能和/或任務,以便您可能會看到明顯的差異。

相關問題