Ako*_*kon 0 c# asp.net parallel-processing performance parallel.foreach
我有一份车辆清单......对于每辆车,我正在做一些移民工作.
foreach (vehicles)
{
1 : Do database table migration for that vehicle
2 : Call an API and save them to database
}
Run Code Online (Sandbox Code Playgroud)
为了提高性能,我将其平行如下:
Parallel.Foreach(vehicles)
{
--same
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?因为我的理解是,它将为每个请求的车辆创建新的线程,事情应该快速.
并行TASK会改进吗?
保持最大并行数是否好?如果是,如何确定该因素?
如果每个Vehicle项目之间很少或没有依赖关系,这是正确的方法.换句话说,您(理想情况下)不应在每个执行lock的主体中具有任何(或其他同步原语).但是,如果您的代码中有s,那么它们应该在代码的一部分上执行得比方法的其余部分快得多:ActionVehiclelock
Parallel.ForEach(vehicles, v =>
{
// Some code that takes long to execute
lock(_syncRoot)
{
_totalProcessedVehicles ++;
}
})
Run Code Online (Sandbox Code Playgroud)
Parallel.Foreach将不创建每线程Vehicle实例-这将产生多个线程,并给每个线程您的收藏来处理的一大块.线程数取决于您的硬件和可用资源.
No. 在内部Parallel.Foreach使用Tasks,这样可以增加代码开销的负担.此外,使用与上面相同的逻辑在不同的线程上调度和执行任务:每个线程处理一大块Tasks.
我不建议指定最大程度的并行性 - 让它CLR为你做; 在绝大多数情况下,它会做得很好.但是,如果您确实要限制并行度,则会有一个重载Parallel.Foreach接受类型的参数ParallelOptions.使用该属性MaxDegreeOfParallelism可以限制并行度.
| 归档时间: |
|
| 查看次数: |
299 次 |
| 最近记录: |