一切都完全是理论上的,这个问题刚想到,我不能完全确定答案是什么:
假设您有一个计算4个独立计算的应用程序。 (完全独立,与你做什么顺序并不重要,你不需要一个人来计算另一个)。 还假设这些计算是长(分钟)和CPU限制(不等待任何类型的IO)
1)现在,如果您有一台 1处理器计算机,那么单线程应用程序在逻辑上会比多线程应用程序更快(或相同)。由于计算机一次只能用一个处理器做一件事,它会浪费掉#34;上下文切换等时间。 到目前为止还不错?
2)如果你有一台 4处理器计算机,那么 4个线程可能比单线程更快。对?您的计算机现在可以一次执行4个操作,因此将您的应用程序划分为4个线程是合乎逻辑的,并且它应该以4个计算中最长的时间完成。 到目前为止还不错?
3)现在我感到很困惑的实际部分 - 为什么我的应用程序创建的线程数多于可用的处理器数量(实际上是核心数)?我编程并看过创建数十个和数百个线程的应用程序,但实际上 - 普通计算机的完美数字大约是8个?
P.S。我已经读过这个:Threading vs single thread 但是并没有安静地回答这个问题。
干杯
答案 0 :(得分:5)
为什么我的应用程序创建的线程数多于可用的处理器数(实际上是核心数)?
一个很好的理由是,如果你有等待事件的线程。例如,您可能有一个生产者/消费者应用程序,其中生产者正在从某些数据流中读取数据,并且该数据以突发形式到达:批次中有几百(或千)条记录,一段时间后没有任何内容,然后是另一条爆。假设你有一台4核机器。您可以拥有一个生成器线程来读取数据并将其放入队列中,还有三个消费者线程来处理队列。
或者,您可以拥有一个生产者线程和四个消费者线程。大多数情况下,生产者线程处于空闲状态,为您提供四个消费者线程来处理队列中的项目。但是当数据流上的项目可用时,其中一个消费者线程将被换出,以支持生产者。
这是一个简化的例子,但与我在制作中的程序大致相似。
更一般地说,创建更多连续工作(即CPU绑定)线程没有任何意义,而不是处理单元(一般来说CPU核心,尽管超线程的存在使得水域稍微混乱)。如果您知道您的线程不会等待外部事件,那么当您只有n+1
核心时拥有n
个线程将最终浪费时间与线程上下文切换。请注意,这完全在您的程序的上下文中。如果有其他应用程序和OS服务正在运行,您的应用程序的线程将不时被换出,以便其他应用程序和服务可以获得时间片。但是人们假设,如果您正在运行CPU密集型程序,那么您将限制同时运行的其他应用程序和服务。
当然,最好的选择是设置测试。在4核机器上,使用1,2,3,4,5 ......线程测试您的应用程序。完成不同数量的线程所需的时间。我想你会发现在4核机器上,最佳位置是3或4;除非有其他应用程序或操作系统服务占用大量CPU,否则很可能是4。
答案 1 :(得分:1)
我认为你假设所有程序都受CPU限制 - 记住你的一些线程将等待I / O(磁盘/网络/用户流量)。
答案 2 :(得分:1)
如果某些线程需要与其他方交互,等待来自服务器的响应,那么我可以提出更多线程而不是核心的原因之一就是从数据库中查询某些内容。这将允许线程休眠直到提供答案。这样其他计算就不必等待了。在4cores-> 4thread中线程将等待输入,这可能导致其他代码也必须等待
答案 3 :(得分:1)
向应用程序添加线程并不严格意味着性能提升。有时您希望或需要同时执行多个任务,因为这是构建程序的最合理方式。
作为一个例子,也许你正在编写一个游戏引擎,如果你采用多线程方法,你可能有一个物理线程,一个线程用于图形,一个线程用于网络,一个线程用于用户输入,一个线程从磁盘等加载资源。
James Baxters的观点也是如此。有时线程正在等待资源,并且在访问所述资源之前无法进一步执行。只有与核心数相同的线程,一个核心将会浪费。