我有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绑定的,则建议将并行度限制为处理器计数。