嵌套的Parallel.ForEach循环

ser*_*0ne 23 .net c# concurrency performance task-parallel-library

我有一些代码,我目前正在优化多核架构中的并发性.在我的一个类中,我发现了一个嵌套foreach循环.基本上,外部循环遍历一个NetworkInterface对象数组.内循环通过网络接口IP地址进行迭代.

它让我思考,嵌套Parallel.ForEach循环一定是个好主意吗?阅读本文后(同一列表上的嵌套Parallel.ForEach循环?)我仍然不确定在效率和并行设计方面适用的是什么.此示例将Parallel.Foreach处理应用于列表的语句,其中两个循环都在该列表上执行操作.

在我的例子中,循环正在做不同的事情,所以,我应该:

  1. 使用嵌套的Parallel.ForEach循环?
  2. 父循环上的User Parallel.ForEach并保持内循环原样?

Roy*_*tus 29

Parallel.ForEach不一定并行执行 - 如果可能的话,它只是一个请求.因此,如果执行环境没有CPU功率来并行执行循环,则不会这样做.

如果循环上的动作不相关(即,如果它们是分开的并且彼此不相互影响),我认为在内循环和外循环上使用Parallel.ForEach都没有问题.

这实际上取决于执行环境.如果您的测试环境与生产环境足够相似,那么您可以进行计时测试,然后确定要执行的操作.如有疑问,请测试;-)

祝好运!

  • 不能同意更多。是的,Parallel.Foreach 背后的调度程序可能不会产生单独的线程,但是您正在跳过任一线程或调度程序的更多开销,而没有任何科学数据来支持它。 (2认同)
  • @MAfifi:请再次阅读我的回答. (2认同)
  • @activwerx:在这种情况下,我会优化您认为最常见的设置.这意味着采用"普通"服务器PC,进行测试和测量.在这种情况下,可能嵌套的并行循环确实会导致开销.如果您事先知道您的代码将在大型硬件上运行,则会有所不同,那么并行性肯定会得到回报. (2认同)