我有一个嵌套的for循环。
我用Parallel.For()
替换了第一个For,并且计算速度提高了。
我的问题是用Parallel.For()
替换第二个(在一个内部)。它会提高速度吗?还是没有区别?还是会慢一点?
修改:
由于核心不是无限制的(通常有2到8个核心),因此内部循环并行运行。因此,如果我使用Parallel.For()
更改内部,则它会并行运行。但我不确定它如何改变性能和速度。
答案 0 :(得分:15)
来自"Patterns of parallel programming"的.NET parallel computing team书中的“太细粒度,太粗粒度”小节,“反模式”部分:
答案是通过表现找到最佳平衡 测试。如果比较并行化的开销很小 对于正在完成的工作,尽可能并行化:在这种情况下, 这意味着并行化两个循环。如果是开销的话 并行化内部循环会降低大多数的性能 系统,在这样做之前要三思而后行,因为这样做可能是最好的 并行化外循环。
看看那个小节,它是自包含的并列光线跟踪应用程序的详细示例。并且它建议扁平化循环以获得更好的并行度也可能对你有所帮助。
答案 1 :(得分:3)
这又取决于很多场景,
如果您的CPU是单核处理器,您将无法获得任何好处。
如果迭代次数更多,您将获得一些改进。
如果只有几次迭代,它会很慢,因为它涉及额外的过载。
答案 2 :(得分:1)
这很大程度上取决于您在for和机器中使用的数据和功能。我最近搞乱了parallel.for和parallel.foreach,并发现他们使我的应用程序更慢......(在4核机器上,可能如果你有24核心服务器是另一个故事)
我认为管理线程意味着过多的开销......
甚至MS在他们的文档上(这是关于它的msdn关于它http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=19222的很长的pdf)承认它不会使应用程序运行得更快。你必须每次都尝试,如果它有效,那就太好了,如果运气不好的话。
你应该尝试使用外部和内部,但至少在我尝试过的应用程序中,没有一个能让应用更快。外部或内部并不重要,我只是得到相同的执行时间甚至更糟。
也许如果你也使用Concurrent集合,你会获得更好的性能。但是,再一次,没有尝试就没有办法说出来。
编辑:
我刚刚在MSDN上找到一个很好的链接,证明在我的情况下非常有用,可以提高Parallel.foreach性能 http://msdn.microsoft.com/en-us/library/dd560853.aspx