我有一個的Parallel.For和常規的for循環做一些簡單的算術,只是基準的Parallel.For的Parallel.For,相較於
我的結論是,常規的是我的睿i5筆記本處理器速度更快。
這是我的代碼
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int Iterations = int.MaxValue/1000;
DateTime StartTime = DateTime.MinValue;
DateTime EndTime = DateTime.MinValue;
StartTime = DateTime.Now;
Parallel.For(0, Iterations, i =>
{
OperationDoWork(i);
});
EndTime = DateTime.Now;
Console.WriteLine(EndTime.Subtract(StartTime).ToString());
StartTime = DateTime.Now;
for (int i = 0; i < Iterations; i++)
{
OperationDoWork(i);
}
EndTime = DateTime.Now;
Console.WriteLine(EndTime.Subtract(StartTime).ToString());
StartTime = DateTime.Now;
Parallel.For(0, Iterations, i =>
{
OperationDoWork(i);
});
EndTime = DateTime.Now;
Console.WriteLine(EndTime.Subtract(StartTime).ToString());
StartTime = DateTime.Now;
for (int i = 0; i < Iterations; i++)
{
OperationDoWork(i);
}
EndTime = DateTime.Now;
Console.WriteLine(EndTime.Subtract(StartTime).ToString());
}
private static void OperationDoWork(int i)
{
int a = 0;
a += i;
i = a;
a *= 2;
a = a * a;
a = i;
}
}
}
這些是我的結果。哪個重複沒有多大變化:
00:00:03.9062234
00:00:01.7971028
00:00:03.2231844
00:00:01.7781017
那麼爲什麼要使用Parallel.For?
如果內存服務,'Parallel.For'並不總是將工作分解成多個線程,它可能在單個線程上運行整個事情。您可能正在查看在輕量級作品上使用「並行」方法所涉及的開銷,因爲在線程上編組工作成本高昂。 –
您在每次迭代中所做的實際工作量並不多,因此創建和管理和整合線程的成本遠高於並行處理獲得的收益。 'Parallel.For'只會在你每輪耗費更多時間的情況下更快。 – Corak
[看看這個最近的答案,我做了一些詳細的時間安排](http://stackoverflow.com/a/16822242/106159)。 'Parallel.For()'適用於小型循環體,如果你使用'Partitioner',就像我在那個答案中那樣。 –