Parallel.ForEach不提供更多内核的速度

时间:2017-08-13 18:01:34

标签: c# multithreading performance parallel-processing

我有两个嵌套的Parallel.ForEach循环,它们对并行度没有限制。我的理解是,对于大多数使用此设置的情况,更多内核=更快的运行时间。但是,在两台不同的机器上运行,一台采用4核4线程,2.8GHz CPU,另一台采用6核12线程3.3GHz CPU。该程序运行时间相同:约5小时。

我无法通过谷歌搜索找到任何东西(尽管不完全确定除了这个问题的标题之外还要搜索什么。)这可以解释为什么会这样。

我确实注意到程序在更快的CPU机器上使用的系统内存要少得多,35MB对160MB,并且根据visual studio诊断工具,更快的CPU使用垃圾收集器的频率更高。不确定为什么会出现这种情况或者在运行时有什么影响?

1 个答案:

答案 0 :(得分:4)

Parallel.ForEach的额外核心仅在您受CPU限制时才能帮助您。这两台机器运行速度相同的原因是限制了你可以在 CPU运行的速度。您可能正在等待某些I / O操作,或者在同步部分中正在执行大量CPU工作,例如在lock块中(无法查看代码时无法确定) 。

您需要通过添加更多内核来获取代码CPU以查看任何改进,为此,您需要确定代码花费最多时间通过分析执行的实际操作,然后执行加速该部分所需的任何操作up(例如,如果是磁盘I / O将数据文件移动到更快的驱动器可能有帮助)或允许该部分以非同步方式运行,如果问题是由锁定引起的(例如切换到线程安全集合)来自System.Collections.Concurrent可能允许您删除锁定语句。)