首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程应用程序会比单线程应用程序快吗?

多线程应用程序会比单线程应用程序快吗?
EN

Stack Overflow用户
提问于 2014-09-11 14:27:04
回答 4查看 3.4K关注 0票数 7

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

假设您有一个计算4个独立计算的应用程序。(完全独立,不管你做什么顺序,你也不需要一个计算另一个)。还假设这些计算是长的(分钟)和CPU限制的(而不是等待任何类型的IO)。

1)现在,如果您有一台1处理器计算机,那么单线程应用程序在逻辑上将比多线程应用程序(或与多线程应用程序相同)更快。由于计算机不能用一个处理器一次做更多的事情,它将“浪费”时间在上下文切换和类似的事情上。到目前一切尚好?

2)如果您有一台4处理器计算机,那么4个线程在这方面可能比单线程更快。对吗?您的计算机现在可以一次执行4个操作,因此将应用程序划分为4个线程是合乎逻辑的,并且它应该以4种计算中最长的时间完成。到目前为止还好吗?

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

我已经读过了:Threading vs single thread,但我没有安静地回答这个问题。

干杯

EN

回答 4

Stack Overflow用户

发布于 2014-09-11 14:38:50

为什么我的应用程序会创建比可用处理器(实际上是内核)数量更多的线程?

一个很好的理由是,如果您有等待事件的线程。例如,您可能有一个生产者/使用者应用程序,其中生产者正在从某个数据流中读取数据,该数据以突发的形式到达:一个批处理中有几百条(或数千条)记录,一段时间内没有任何记录,然后是另一次突发。假设你有一台四芯机器。您可以有一个生产者线程读取数据并将其放在队列中,以及三个使用者线程来处理队列。

或者,您可以有一个生产者线程和四个使用者线程。大多数情况下,生产者线程处于空闲状态,给您四个使用者线程来处理队列中的项。但是,当数据流上的项可用时,其中一个使用者线程就会被交换出来,以支持生产者。

这是一个简化的例子,但与我在生产中的程序非常相似。

更普遍地说,创建比处理单元更多的连续工作(即CPU绑定)线程没有任何意义(CPU核心在一般情况下,尽管超线程的存在使水变得有点混乱)。如果您知道您的线程不会等待外部事件,那么在只有n+1内核的情况下拥有n线程将导致线程上下文切换浪费时间。请注意,这是严格在您的程序的上下文中。如果有其他应用程序和OS服务正在运行,则您的应用程序的线程将不时被交换,以便其他应用程序和服务可以获得时间间隔。但有人认为,如果您运行的是CPU密集型程序,您将限制其他同时运行的应用程序和服务。

当然,你最好的选择就是做个测试。在4核机器上,用1,2,3,4,5测试你的应用程序,.线程。用不同数量的线程完成所需的时间。我想你会发现,在一台4核机器上,最合适的地方是3或4,很可能是4,除非有其他的应用程序或操作系统服务占用大量CPU。

票数 5
EN

Stack Overflow用户

发布于 2014-09-11 14:29:51

我认为您假设所有程序都是CPU绑定的-请记住,您的一些线程将等待I/O (磁盘/网络/用户通信)。

票数 1
EN

Stack Overflow用户

发布于 2014-09-11 14:31:02

我可以想出比核心更多的线程的原因之一是如果一些线程需要与其他各方进行接口.等待服务器的响应。从数据库中查询一些信息。这将允许线程休眠,直到提供答案。这样,其他计算就不用等待了。在4核>4线程中,线程将等待输入,这可能导致其他代码也不得不等待。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25790064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档