2012-05-02 89 views
5

在過去的幾天裏,我一直在學習一些關於並行的知識,並且我遇到了this的例子。爲什麼在這個例子中並行版本比順序版本慢?

我把它側這樣的環路的時序擺動:

private static void NoParallelTest() 
{ 
    int[] nums = Enumerable.Range(0, 1000000).ToArray(); 
    long total = 0; 
    var watch = Stopwatch.StartNew(); 
    for (int i = 0; i < nums.Length; i++) 
    { 
     total += nums[i]; 
    } 
    Console.WriteLine("NoParallel"); 
    Console.WriteLine(watch.ElapsedMilliseconds); 
    Console.WriteLine("The total is {0}", total); 
} 

我很驚訝地看到,NOPARALLEL方法完成的方式的方式比在現場給出的並行例子更快。

我有一臺i5電腦。

我真的認爲Parallel方法會更快完成。

有沒有合理的解釋呢?也許我誤解了一些東西?

+1

你能否證實其水貨版本居然跑在多個內核?當你增加迭代次數(更大的'範圍')時會發生什麼? – chrisaycock

+6

假設並行版本確實在多個內核上運行,它可以簡單地向您顯示多少線程同步可以具有多少開銷......特別是在一小段代碼中。 – Oded

+0

解釋馬克吐溫; *「有謊言,該死的謊言,統計數字和基準......」* –

回答

10

順序版本更快,因爲在您的示例中,每次迭代的操作花費的時間非常短,並且創建和管理多個線程所涉及的開銷相當大。

並行編程僅在每次迭代在處理器時間方面足夠昂貴時才提高效率。

2

我認爲這是因爲循環執行一個非常簡單,非常快速的操作。

在非平行版本的情況下,它就是它的全部功能。但並行版本必須調用委託。調用一個委託是相當快的,通常你不必擔心你多久這樣做。但在這種極端的情況下,這是什麼改變了這一點。我很容易想象,調用委託會比從數組中增加一個數字慢十倍(或更多,我不知道確切的比率是多少)。

2

你不是在比較蘋果和橘子。

你鏈接到的例子並不是關於並行性或併發性多達它是關於斷開狀態從不同線程共享。它正在做的工作是一個稻草人,只是表明正在做的事情。

所以你比較就像比較一輛F1賽車和一個頂級燃料拖拉機。各擅長去,但是相對於背景哪些在這個和大多數情況下是高度專業化。他們都不能在其他高度專業的公司中競爭。

吸取教訓

  • 併發!=更快
  • 考慮不周的基準誤導
相關問題