多线程应用程序实际上是否比单线程应用程序更快?

Ale*_*exD 6 multithreading cpu-cores processors

一切都完全是理论上的,这个问题刚想到,我不完全确定答案是什么:

假设您有一个计算4个独立计算的应用程序.(完全独立,无论你做什么顺序并且你不需要计算另一个).还假设这些计算是长(分钟)和CPU绑定(不等待任何类型的IO)

1)现在,如果你有一个1处理器的计算机,单个线程应用程序在逻辑上会比多线程应用程序更快(或相同).由于计算机无法使用一个处理器一次做多件事,因此会浪费时间进行上下文切换等.到现在为止还挺好?

2)如果你有一台4处理器的计算机,4线程的速度通常比单线程更快.对?您的计算机现在可以一次执行4个操作,因此将您的应用程序划分为4个线程是合乎逻辑的,并且它应该以4个计算中最长的时间完成.到目前为止仍然很好?

3)现在我感到困惑的实际部分 - 为什么我的应用程序创建的线程数多于可用的处理器数量(实际上是核心数)?我已经编程并且已经看到了创建数十个和数百个线程的应用程序,但实际上 - 对于普通计算机来说,完美的数字大约为8?

PS我已经读过这个:线程与单线程 但没有安静的回答.

干杯

Jim*_*hel 5

为什么我的应用程序创建的线程数多于可用的处理器数(实际上是核心数)?

一个很好的理由是,如果你有线程等待事件.例如,您可能有一个生产者/消费者应用程序,其中生产者正在从某些数据流中读取数据,并且该数据以突发形式到达:批次中有几百(或千)条记录,后来暂时没有任何内容,然后是另一条爆.假设你有一台4核机器.您可以拥有一个生成器线程来读取数据并将其放入队列,还有三个消费者线程来处理队列.

或者,您可以拥有一个生产者线程和四个消费者线程.大多数情况下,生产者线程处于空闲状态,为您提供四个消费者线程来处理队列中的项目.但是当数据流上的项目可用时,其中一个消费者线程会被换出,以支持生产者.

这是一个简化的例子,但与我在制作中的程序大致相似.

更一般地说,创建更多连续工作(即CPU绑定)线程没有任何意义,而不是处理单元(一般来说CPU核心,尽管超线程的存在使得水域稍微混乱).如果您知道您的线程不会等待外部事件,那么n+1当您只有n核心时拥有线程将最终浪费时间与线程上下文切换.请注意,这完全在您的程序的上下文中.如果有其他应用程序和OS服务正在运行,您的应用程序的线程将不时被换出,以便其他应用程序和服务可以获得时间片.但是人们假设,如果您正在运行CPU密集型程序,那么您将限制同时运行的其他应用程序和服务.

当然,你最好的选择是设置一个测试.在4核机器上,使用1,2,3,4,5 ......线程测试您的应用程序.完成不同数量的线程所需的时间.我想你会发现在4核机器上,最佳位置是3或4; 除非有其他应用程序或操作系统服务占用大量CPU,否则很可能是4.


Jam*_*ter 1

我认为您假设所有程序都受 CPU 限制 - 请记住您的某些线程将等待 I/O(磁盘/网络/用户流量)。