下面這段放在 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
留言列表