隨著多核電腦變得越來越普遍,令人煩惱的是迴圈不能利用這些多餘的核心資源。不過幸運的是微軟的帥哥靚女為我們解決了這種困惑,他們已採取措施使我們迴圈可以利用這些額外的核心資源。我將展示一個程式碼範例,示範.NET 4.0中的一個新的功能叫做Task Parallel Library。有了這個庫,可以非常容易編寫託管語言來使用多核心。這樣我們就可以編寫並行任務的代碼,它可以同時運行在可用的處理器上。一般來說,這樣可以顯著地加快了代碼啟動並執行速度。
這裡有一個並行樣本的代碼:
using System;namespace ParallelForSample{ public class SingleCore { public static void Calculate(int calcVal) { Utility util = new Utility(); util.Start(); int[,] G = new int[calcVal, calcVal]; for (int k = 0; k < calcVal; k++) for (int i = 0; i < calcVal; i++) for (int j = 0; j < calcVal; j++) G[i, j] = Math.Min(G[i, j], G[i, k] + G[k, j]); util.Stop(); } }}
正如你可以看到,這是一個相當簡單的類 - 它用了三個迴圈填充數組。現在,使用TPL(Task Parallel Library)重寫這段代碼:
using System;using System.Threading.Tasks;namespace ParallelForSample{ public class MultiCore { public static void Calculate(int calcVal) { Utility util = new Utility(); util.Start(); int[,] G = new int[calcVal, calcVal]; Parallel.For(0, calcVal, delegate(int k) { Parallel.For(0, calcVal, delegate(int i) { for (int j = 0; j < calcVal; j++) G[i, j] = Math.Min(G[i, j], G[i, k] + G[k, j]); }); } ); util.Stop(); } }}正如你可以看到,這是文法是稍有不同。 for迴圈分解成Parallel.For。這需要一個委託,實際上執行迴圈的行為的是這個委託。如果你下載並運行該樣本,您可以觀察到不同的行為和不同的迴圈計時。
不過需要有一個多核的機器,才可以看到這種差距,如果是一台單核的機器,你是觀察不到的。
以下是譯者加:
我的電腦配置如:
運行結果:
我們可以看到差距接近10秒之多。
代碼:/Files/zhuqil/parallelforsample.zip
原文:faster-faster-loops