2017-10-19 66 views
-1

我讀過,如果foreach非常簡單,我得到的使用並行foreach的開銷不值得。所以我有一個簡單的WPF應用程序來做一些測試。我有這個代碼:平行的時間爲什麼?下一次這是第一次很高,很低?

//Parallel.Foreach 
txtLog.Text = txtLog.Text + "\r\n\r\n\r\nSe inicia el Parallel.Foreach a " + DateTime.Now; 
miSw.Restart(); 
Parallel.ForEach(miLstInt, 
    (iteradorInt, state) => 
    { 
     if (iteradorInt >= 500000) 
     { 
      state.Stop(); 
     } 
    }); 
miSw.Stop(); 

txtLog.Text = txtLog.Text + "\r\nTiempo total del Parallel.Foreach: " + miSw.ElapsedMilliseconds.ToString(); 



//Forech 
txtLog.Text = txtLog.Text + "\r\n\r\nSe inicia el foreach a " + DateTime.Now; 
miSw.Restart(); 
foreach (int i in miLstInt) 
{ 
    if (i >= 500000) 
    { 
     break; 
    } 
} 
miSw.Stop(); 
txtLog.Text = txtLog.Text + "\r\nTiempo total del foreach: " + miSw.ElapsedMilliseconds.ToString(); 

我有一個按鈕,當我點擊它時,它運行兩個foreach並在文本框中顯示結果。

當我第一次運行時,平行foreach大約需要29ms,而且每個約3ms。但是第二次運行它和下一次,平行foreach需要0ms,foreach在2或3ms之間,比3多2次,但結果更穩定。

所以我的疑問是,爲什麼它第一次更慢,但後來更快?我是否應該考慮這一點,如果我將多次運行命令,儘管第一次運行速度較慢,如果下一次運行速度更快,是否值得平行使用?

+2

我強烈懷疑這只是正常的JIT時間,因爲你測量的時間不是最優方式 - https://stackoverflow.com/questions/457605/how-to-measure-code-performance-in-net ...如果同意,請考慮關閉重複。 –

回答

1

並行Foreach使用託管線程池,以便首次運行成本可能表示線程的初始產卵。

線程將留在池中,並在隨後的運行中重新使用。

統計學上,您可能希望生成更大的數字來衡量性能差異 - 並且您無法爲此創建Jefferson定律,因爲不同的工作負載會從並行化中獲益或多或少。

+2

儘管您的陳述也許是正確的,但OP提供的兩個代碼並不完全相同。在迭代所有索引之前,並行循環可能會更快地中斷。 –

相關問題