下面這段放在  public static void Main(string[] args) 裡跑

這裡面測試的有兩個方法,分別是           

//使用Parallel方法    (應該就是多執行緒的意思)

//普通迴圈   (應該就是單執行緒的意思)

 

測試時先取消註解Parallel部分,註解普通迴圈部分,這樣測得的結果為Parallel的

然後再註解Parallel,取消註解普通迴圈,這樣跑出的結果是普通迴圈

兩個方法的執行內容相同,所以時間的快慢就相當於速度快慢

結果跑Parallel約 7s完成,普通迴圈要17秒,差了2倍

另從印出順序可明顯看出普通迴圈依序印出,Parallel是亂序印出

--------------------------------------------------------------------------------------------
            DateTime time_start = DateTime.Now;//計時開始 取得目前時間


            int N = 75;


            ////使用Parallel方法
            //Parallel.For(0, N, i =>
            //{
            //    for (int j = 0; j < 100000000; j++)
            //    {
            //        int k = 9999;
            //        k *= k;
            //    }
            //    Console.WriteLine(i);
            //});

            //普通迴圈
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < 100000000; j++)
                {
                    int k = 9999;
                    k *= k;
                }
                Console.WriteLine(i);
            }


 

            
            DateTime time_end = DateTime.Now;//計時結束 取得目前時間
            //後面的時間減前面的時間後 轉型成TimeSpan即可印出時間差
            Console.WriteLine(
            ((TimeSpan)(time_end - time_start)).TotalMilliseconds.ToString()
            );

           

            Console.Read();           

---------------------------------------------

 

 

接著類似方法稍微改變執行內容,

改成每次單純Console.WriteLine,

再測試看看

 

---------------------------------------------


            DateTime time_start = DateTime.Now;//計時開始 取得目前時間


            int N = 100000;

 

             //使用Parallel方法
            //Parallel.For(0, N, i =>
            //{
            //    Console.WriteLine(i);
            //});

 

            //普通迴圈
            for (int i = 0; i < N; i++)
            {
                Console.WriteLine(i + " test");
            }
            
            

            DateTime time_end = DateTime.Now;//計時結束 取得目前時間
            //後面的時間減前面的時間後 轉型成TimeSpan即可印出時間差
            Console.WriteLine(
            ((TimeSpan)(time_end - time_start)).TotalMilliseconds.ToString()
            );                        
            Console.Read();

---------------------------------------------

 

測試結果   普通迴圈8s,Parallel 13s

發現這種情況Parallel竟比普通迴圈慢

 

應該是因為執行的內容所需時間極短,只有短短一行印出,

在這種情況下可能切換執行緒的時間就顯得佔很大比重了(純推測不一定正確),

所以不切執行緒一直印反而少了切執行緒的時間,印出比較快

 

由這兩者比較可以明顯看出,

多執行緒適合在每個迴圈內容非常花時間的時候可以明顯看出效果

 

簡單以兩次迴圈來看,假設每次迴圈需要花時一分鐘,

那單執行緒就需要兩分鐘,

兩條執行緒同時各跑一次迴圈各要一分鐘,但因為幾乎同時進行˙,

所以只需一分鐘,

速度就會是單執行緒的兩倍了省了一分鐘的時間

 

 

這邊的程式碼內容改編自

https://msdn.microsoft.com/zh-tw/library/system.threading.tasks.parallel(v=vs.110).aspx

 

arrow
arrow
    全站熱搜

    olivermode 發表在 痞客邦 留言(0) 人氣()