1. 程式人生 > >C#平行計算類Parallel的效能測試

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類提供了一個簡易的平行計算方案,可以顯著提高計算效能。