如何将For循环分解为Parallel.For循环



我有3个For循环运行了很多迭代:

for (int i = 0; i < 1000000; i++) 
{
for (int j = 0; j < 1000000; j++)
{
var myObj = new MyObj(i,j);
var a = myObj.doSomething();
for (int k = 0; k < 1000000; k++)
{
a.work();
}
}
} 

我必须运行总共10^18次迭代,这将花费大量时间来完成。

有没有一种快速的方法可以使用Parallel.For使循环运行得更快?如果是,如何更改我的代码?

如果要完成的工作过于细粒度,那么与并行相关的开销可能大于并行执行带来的收益。因此,仅对外环使用Parallel.For就足够了。它的优点是可以创建更多的工作块,并最大限度地减少开销。

这仍然需要同时执行100万项任务。这已经足够了。

var options = new ParallelOptions {
MaxDegreeOfParallelism = Environment.ProcessorCount
};
var result = Parallel.For(0, 1000000, options, (i, state) =>
{
for (int j = 0; j < 1000000; j++)
{
var myObj = new MyObj(i,j);
var a = myObj.doSomething();
for (int k = 0; k < 1000000; k++)
{
a.work();
}
}
});

但请注意,如果a.work()使用需要独占访问的资源,那么所涉及的锁定可能会破坏优势。

如果工作主要是CPU绑定的,则建议将并行度限制为处理器计数。

最新更新