C#平行計算類Parallel的效能測試
為下個學期的《C#程式設計與應用》課程做準備,這個暑假部分學習了Herbert Schildt的名著《C#4.0完全參考手冊》,並決定從.NET 2.0更新到.NET 4.0開發環境。比較.NET 2.0框架,還是學到了不少有用東西。比如:Turple類,解決了以前返回多個結果時需要out引數或新定義一個類的問題;其次是實用的大整數類BigInteger;另一個是HashSet集合,為唯一編號搜尋提供了簡單解決方法,當然也用於數學中的集合計算。
因為假期還做了個千萬級檔案記錄的大資料彙總稽核軟體sfsjAnalyzer,需要高效能的記錄查重演算法。雖然通過技術手段在10至30分鐘內計算得到結果(剛開始時是3個小時!呵呵!),但感覺還有提升的餘地,至少應該利用當前主流的多核環境和平行計算。為此,程式設計測試了C#的並行類的效能。下面是測試程式碼和執行結果圖片。
using System; using System.Threading.Tasks; using System.Numerics; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); Parallel.Invoke(Calc100, Calc100); sw.Stop(); Console.WriteLine("main thread cost time = " + sw.ElapsedMilliseconds + "(ms)"); } static void Calc100() { int n = 1000000; BigInteger b = new BigInteger(long.MaxValue); System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); for (var k = 1; k <= n; k++) { BigInteger b2 = b * b; } sw.Stop(); Console.WriteLine("calc " + n + " times bigint multiply cost time " + sw.ElapsedMilliseconds + "(ms)"); } } }
上面結果圖可以看出,單個計算100萬個大整數乘的方法Calc100()需要的時間大致是200ms,於是序列呼叫兩個Calc100()的時間將是400ms左右。在主執行緒中使用Parallel.Invoke()方法並行運算兩個Calc100()方法,總計時間是219ms,幾乎節省了一半時間。
俺的計算環境是:Thinkpad E430、win7/X64、Core I3-3210M,2.5G主頻,4G記憶體。經網查,機器處理器是雙核心四執行緒的CPU。顯然,圖片顯示的結果表明並行類Parallel利用了機器的雙核心做平行計算,於是節省了一半的時間。如果是N核心的話,將獲得單個計算的大約1/N時間的高效能效果。
總之,在多核計算環境下,C#的Parallel類提供了一個簡易的平行計算方案,可以顯著提高計算效能。