【发布时间】:2013-05-27 06:05:15
【问题描述】:
我有一个 Parallel.For 和一个常规 for 循环做一些简单的算术,只是为了对 Parallel.For 进行基准测试
我的结论是,常规 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方法所涉及的开销,其中在线程上编组工作的成本很高。 -
您在每次迭代中所做的实际工作并不多,因此创建、管理和合并线程的成本远高于您从并行处理中获得的收益。
Parallel.For只有在你每轮做更多耗时的事情时才会更快。 -
Have a look at this recent answer where I make some detailed timings。如果您像我在那个答案中那样使用
Partitioner,Parallel.For()确实适用于小型循环体。
标签: c# for-loop parallel-processing