[C#] Parallel平行處理測試

類別: System.Threading.Tasks.Parallel

命名空間:  System.Threading.Tasks

版本: .NET Framework 4.0以上

說明: 提供平行迴圈和區域的支援。

 

提醒:

  • 對於迴圈中所使用到的共同變數,都需要特別注意執行緒的同步存取問題。
  • 因此不如想像中的容易使用,需要再了解多執行緒的使用方式(資料型別、控制項的存取)。

測試程式參考:

測試程式結果:

2015-9-2 下午 06-43-15

測試程式:

static void Main(string[] args)
        {
            Random rand = new Random();
            Stopwatch sw = new Stopwatch();

            //準備測試資料
            List<string> testData = new List<string>();

            //產生亂數資料
            for (int i = 0; i < 2000000; i++)
                testData.Add(rand.Next().ToString());
            
            //單執行緒測試
            sw.Reset();
            sw.Start();
            int result = 0;
            foreach (string str in testData)
            {
                if (str.Contains("99"))
                    result++;
            }
            sw.Stop();
            Console.WriteLine("單執行緒:");
            Console.WriteLine("Result = "+ result.ToString());
            Console.WriteLine("TimeSpan = " + sw.Elapsed.ToString());
            Console.WriteLine();
            //平行運算測試
            sw.Reset();
            sw.Start();

            ConcurrentQueue<string> Queue = new ConcurrentQueue<string>();
            Parallel.ForEach(testData, (item, loopState) =>
            {
                if (item.Contains("99"))
                    Queue.Enqueue(item);//需用ConcurrentQueue或stack之類有安全執行緒的集合,僅用int++會有漏失
            });
            sw.Stop();
            Console.WriteLine("ParallelForEach:");
            Console.WriteLine("Result = " + Queue.Count);
            Console.WriteLine("TimeSpan = " + sw.Elapsed.ToString());

            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("按下Enter後繼續...");
            Console.ReadLine();
        }
廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s