嵌套的Parallel.ForEach循环

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

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

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

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

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

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

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

祝好运!

答案是,这取决于;

  1. 一旦你拥有了IP地址,你在做什么?
  2. 每个步骤需要多长时间?

线程并不便宜,它们需要时间来创建,并且内存存在。 如果你没有使用这些IP地址做一些计算成本高昂的东西,并且使用错误类型的集合进行并发访问,那么你几乎肯定会减慢你的应用程序的速度。

使用StopWatch帮助您回答这些问题。