为什么三个线程比10+更快

时间:2012-03-01 10:10:36

标签: .net multithreading performance

我的问题是针对Windows环境中多线程的性能问题。 在测试我的代码后,我得到的结果是增加线程数不会增加并行计算的性能,并且在计算之后变得更少。到底是怎么回事?是否有可能找出最佳线程数的公式:F(处理器,内存..)=?

6 个答案:

答案 0 :(得分:6)

首先,由于你的CPU对它可以同时执行的线程数有硬件限制(例如4个用于四核,如果它有HyperThreading则加倍),你无法通过创建更多线程来获得更好的性能比你有核心。事实上,额外的线程会降低性能,因为线程调度和同步的开销增加,而每单位时间完成的工作仍然相同。

Task Parallel Library是一个非常好的起点,如果你想让运行时自动为你管理一些参数 - 你可以采取明确的控制,如果将来你发现有理由这样做。

答案 1 :(得分:4)

这取决于线程正在做什么。如果它们主要受CPU限制,则每个处理器核心的最佳线程数为1。如果他们在等待来自内核的响应时执行任何重要的IO,那么更多的线程将提高性能。

当每个核心有多个线程时会产生上下文切换开销,因此增加CPU绑定计算的线程数总会影响性能。

答案 2 :(得分:2)

如果您正在寻找公式,那就是Amdahl's law

  

在并行计算中使用多个处理器的程序的加速受到程序的连续分数所需的时间的限制。例如,如果一个程序需要20个小时使用单个处理器核心,并且1小时的特定部分不能并行化,而剩余的19小时(95%)的有希望的部分可以并行化,那么无论我们投入多少处理器对于该程序的并行执行,最小执行时间不能小于关键的1小时。

答案 3 :(得分:2)

10+个线程不一定比3快的原因是每个线程都有一个开销。这是管理线程本身 - 确保每个线程获得适当的处理时间,并管理线程之间传递的数据。

因此,您拥有的线程越多,此非处理开销就越大。

如果你有一个四核处理器,那么三个线程中的每一个都可以100%在核心上运行(这不是真的,但它就是一个例子)。但是,使用9个线程,每个线程只能在核心上运行33%的时间 - 它必须与其他2个线程共享它。管理这个的开销意味着9个线程实际上比3慢。

答案 4 :(得分:1)

您可以查看.NET 4.0中的Task Parallel Library。如果您运行的是旧版本的框架,则可以使用thread pool来避免手动创建线程。

答案 5 :(得分:1)

很难给出一个精确的一般规则。通常,如果您经常等待(对于I / O左右),则线程数比核心数更多。但是,如果你真的在计算东西,那么核心的数量是很好的。更多线程不会使CPU更快,但它们确实增加了调度工作量。