【发布时间】:2011-04-28 21:02:02
【问题描述】:
在我们的服务器上,我们有一个四核处理器。当运行没有 ParallelOptions 参数的 Parallel.For 循环时,它将使用多少个线程?
另外,在运行嵌套循环时,外部循环和内部循环应该是并行的,还是只在性能方面是外部的?
【问题讨论】:
-
你的测试揭示了什么?您在尝试此操作时获得的结果是否有一些疑问?
在我们的服务器上,我们有一个四核处理器。当运行没有 ParallelOptions 参数的 Parallel.For 循环时,它将使用多少个线程?
另外,在运行嵌套循环时,外部循环和内部循环应该是并行的,还是只在性能方面是外部的?
【问题讨论】:
你无法知道具体有多少,所以线程数在1和n之间,其中n是要并行运行的任务数(一个线程可能是当前线程顺便说一句,因为Parallel 等待其任务完成)。 Parallel 不保证操作是同时运行的,但只能保证它们可能是。实现您自己的Task Scheduler,如果您想控制使用多少线程,请使用它。
如果你想知道并行运行外循环和内循环是否更好,没有答案。我们不知道你的循环在做什么。在尝试优化循环之前使用性能分析器,因为您很可能不知道性能瓶颈在哪里。
【讨论】:
这取决于。 Parallel.For 中的嵌套 Parallel.For 将并行化每个并行化循环。但是,如果您不这样做,那么 for 循环将完全在同一个线程内执行。一定要阅读 MSDN 中的 Parallel 库。
http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.for.aspx
我想说 .Net CLR 会对您尝试做的事情进行一些评估,并生成尽可能多的有意义的线程,但我不能肯定地说。
【讨论】:
TPL 将自动确定要使用多少线程,您可以假设它能够使用所有 CPU。
至于循环,其中只有一个应该是并行的,但哪一个真正取决于每个循环的工作负载和大小。如果外部可以是并行的,并且您不需要任何同步,这可能是更好的并行。
【讨论】: