嵌套的Parallel.ForEach循环

时间:2012-09-27 09:35:22

标签: c# .net concurrency task-parallel-library performance

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

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

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

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

2 个答案:

答案 0 :(得分:26)

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

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

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

祝你好运!

答案 1 :(得分:3)

答案是,这取决于;

  1. 一旦拥有IP地址,你在做什么?
  2. 每个步骤需要多长时间?
  3. 线程并不便宜,它们需要时间来创建,而内存则存在。如果您没有使用这些IP地址做一些计算成本高昂的事情,并且使用错误类型的集合进行并发访问,那么您几乎肯定会降低应用程序的速度。

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