我有一个的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',就像我在那个答案中那样。 –