|
VS2010&.NET 4.0的Beta2相比Beta1在性能上有了很大的改進,已經基本可以使用了。.NET 4.0給我們帶來許多新特性,如動態類型、云平臺、并行運算等。本文討論一下.NET 4.0的并行運算。
其實并行運算并不是在.NET 4.0才有的。大家都知道,通過增加CPU的主頻可以提高CPU的性能,但由于設計的限制,主頻是不可能無限制的提高。這個時候,把提高性能的方式轉向使用多個心(多核),現在的電腦幾乎都是多核的。但在軟件中并還沒有跟上這個節奏,大多數軟件還是采用傳統的方式,并沒有很好的發揮多核的優勢。
微軟的并行運算平臺(Microsoft’s Parallel Computing Platform (PCP))提供了這樣一個工具,讓軟件開發人員可以有效的使用多核提供的性能。本文就進行一個簡單的測試,來體驗并行運算的性能。
1. 新建一個List,并在開始時初始化
public static IList<int> Datas = new List<int>(); static void Main(string[] args) { InitializeData(); Console.Read(); } /// <summary> /// 初始化數據 /// </summary> private static void InitializeData() { Datas.Clear(); for (int i = 0; i < 20; i++) { Datas.Add(i); } }
2.設計耗時的方法,并來在各種運算方式中調用
/// <summary> /// 獲得數據 /// </summary> /// <param name="i"></param> /// <returns></returns> private static int GetData(int i) { System.Threading.Thread.Sleep(100); return i; }
3. 設計一般的運算方式,調用GetData方法
/// <summary> /// 采用一般for循環 /// </summary> private static void UseFor() { for (int i = 0; i < 20; i++) { GetData(Datas[i]); } } /// <summary> /// 采用一般的foreach /// </summary> private static void UseForeach() { foreach (var item in Datas) { GetData(item); } }
4.采用并行運算的方式,調用GetData方法
/// <summary> /// 采用并行for循環 /// </summary> private static void UseParalleFor() { Parallel.For(0, 20, (i) => { GetData(Datas[i]); }); } /// <summary> /// 采用并行的foreach /// </summary> private static void UserParalleForeach() { Parallel.ForEach(Datas, (t) => { GetData(t); }); }
5.最后采用老趙設計的CodeTimer來比較每一種運算方式的耗時,在Main函數中加入測試代碼
static void Main(string[] args) { InitializeData(); CodeTimer.Initialize(); CodeTimer.WriteDebug("一般for循環:", 5, () => { UseFor(); }); CodeTimer.WriteDebug("一般foreach循環:", 5, () => { UseForeach(); }); CodeTimer.WriteDebug("并行for循環:", 5, () => { UseParalleFor(); }); CodeTimer.WriteDebug("并行foreach循環:", 5, () => { UserParalleForeach(); }); Console.Read(); }
6.運算結果:
可以看出,并行運算提高的性能還是比較明顯的。
下面我們把GetData方法修改一下,把線程延遲的的代碼去掉
/// <summary>/// 獲得數據/// </summary>/// <param name="i"></param>/// <returns></returns>private static int GetData(int i){ // System.Threading.Thread.Sleep(100); return i;}
再次運行
可以看出,這時候并行運算不但沒降低消耗的時間,反而用了更多的時間。經過多次測試發現,采用并行運算跟程序的設計結構有很大的關系,如果設計不合理,反而會消耗更多時間。
NET技術:VS2010&amp;.Net 4.0 之并行運算(Parallel)(For、Foreach),轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。