24

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

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

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

  1. 使用嵌套的 Parallel.ForEach 循环?
  2. 父循环上的用户 Parallel.ForEach 并保持内部循环不变?
4

2 回答 2

32

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

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

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

祝你好运!

于 2012-09-27T09:44:32.277 回答
4

答案是,这取决于;

  1. 拥有 IP 地址后,您将如何处理它?
  2. 每个步骤需要多长时间?

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

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

于 2012-09-27T09:44:20.247 回答