Parallel.For vs for
本文关键字:for vs For Parallel | 更新日期: 2023-09-27 18:16:10
我有一个并行。For和一个常规的For循环做一些简单的算术,只是为了测试并行。
我的结论是,在我的i5笔记本处理器上,常规的for更快。
这是我的代码
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呢?div ?
并行处理有组织开销。想象一下,有100个任务,10个人去完成它们。有10个人为你工作是不容易的,除了真正完成100项任务外,还要组织谁做需要时间的事情。
所以,如果你想并行地做一些事情,确保它是如此多的工作,使得组织并行性的工作量与实际工作量相比是如此之小,以至于这样做是有意义的。
当人们第一次深入研究多线程时,最常犯的错误之一就是认为多线程是免费的午餐。
事实上,将操作分成多个较小的操作,然后并行运行,将会花费一些额外的时间。如果同步得不好,任务可能会花费更多的时间,等待其他任务释放锁。
作为结果;当每个任务只做很少的工作时,并行化是不值得花费时间和麻烦的,这就是OperationDoWork
的情况。
考虑试一下:
private static void OperationDoWork(int i)
{
double a = 101.1D * i;
for (int k = 0; k < 100; k++)
a = Math.Pow(a, a);
}
根据我的基准测试,for
将平均为5.7秒,而Parallel.For
将花费3.05秒在我的Core2Duo CPU上(加速== ~1.87)。
在我的四核i7上,for
的平均速度为5.1秒,Parallel.For
的平均速度为1.38秒(加速== ~3.7)。
修改后的代码可以很好地扩展到可用的物理内核数量。Q.E.D.
标题>