天天看點

一起談.NET技術,.Net4.0 Parallel程式設計(一)Data Parallelism 上  Parallel.ForEach  總結

  Parallel.For

  首先先寫一個普通的循環:

private void NormalFor()

{

for (var i = 0; i < 10000; i++)

for (var j = 0; j < 1000; j++)

for (var k = 0; k < 100; k++)

DoSomething();

}

  再看一個并行的For語句:

private void ParallelFor()

Parallel.For(0, 10000, i =>

for (int j = 0; j < 1000; j++)

});

  看下測試方法:

[TestMethod()]

public void TestForLoop()

_StopWatch.Start();

this.NormalFor();

_StopWatch.Stop();

Console.WriteLine("NormalForLoop Runned Time:{0}", _StopWatch.ElapsedMilliseconds);

_StopWatch.Reset();

this.ParallelFor();

Console.WriteLine("Parallel Loop:{0}", _StopWatch.ElapsedMilliseconds);

  測試結果:

一起談.NET技術,.Net4.0 Parallel程式設計(一)Data Parallelism 上  Parallel.ForEach  總結

  上面的例子中,隻是将最外層的For語句替換成了Parallel.For,我們可以看到Parallel執行速度提高了近一倍。下面我把裡面的循環也改成并行的:

private void ParallelNestedFor()

Parallel.For(0, 1000, j =>

  結果:

一起談.NET技術,.Net4.0 Parallel程式設計(一)Data Parallelism 上  Parallel.ForEach  總結

  也許會令我們感到驚訝的是:嵌套Paralled For之後速度并沒有更快,反而稍微慢了。其實是這樣的,因為我們的示例中大部分操作是在最外層循環,而在并行操作中會需要緩存資料等會浪費一定的性能。當我們把最外層的循環調整成100,中間層為10000時,我們來看下結果:

一起談.NET技術,.Net4.0 Parallel程式設計(一)Data Parallelism 上  Parallel.ForEach  總結

  是以,是否需要嵌套的時候,需要我們根據一些實際情況來決定,不過對于大部分操作,最外層的并行處理已經足夠了。

  我們來看兩段很簡單的代碼:

private void NormalForeach()

foreach (var file in GetFiles())

private void ParallelForeach()

Parallel.ForEach(GetFiles(), file => {

  測試的結果:

一起談.NET技術,.Net4.0 Parallel程式設計(一)Data Parallelism 上  Parallel.ForEach  總結

  Foreach的使用跟For使用幾乎是差不多了,隻是在對非泛型的Collection進行操作的時候,需要通過Cast方法進行轉換。

  在本文中,我們簡單的介紹了Parallel.For跟Parallel.Foreach方法的使用,感受了下并行程式設計給我們帶來的速度上的優勢,在下篇文章中會介紹如何跳出循環以及一些異常的處理。

繼續閱讀