多线程在双核CPU下无IO阻塞能提高效率吗
最近在学习多线程,很多网上资料说多线程是为了设计,并不是为了提高效率而生。主要用在出现IO等阻塞时才能提高效率,其他情况下不能提高。这是真的吗?多个CPU下呢?
如果我有一大批文件要解析(已经传过来没有IO阻塞),起个线程池用多个线程去解析真的和一个一个解析快不了多少吗?
在双核下呢?
小弟原来测试过双核下多个线程去上传大文件,结果速度并没有比单个线程快多少,是不是因为IO的速度大大限制了?谢谢
------解决方案--------------------这个问题有点复杂,似乎不是简单几句话就能说清楚的。
决定效率主要概括为两个大因素:IO(网络或磁盘)、CPU。
对于IO而言,举个极端的例子,你用个64KB的小猫从网上下载某个软件0,如果浏览器不是多线程模型的话,那么就一直在那里耗着,啥事也干不了。(当然如果要较真的话,就算不是多线程模型,也有办法不被完全阻塞的)
接下来看看你的问题:
◎ 如果我有一大批文件要解析(已经传过来没有IO阻塞),起个线程池用多个线程去解析真的和一个一个解析快不了多少吗?
—— 是的,如果你假定完全没有IO阻塞,确实多线程不会比单线程快,甚至还可能更慢,因为线程切换是有开销的。
◎在双核下呢?
—— 那就大大的不一样,单个线程只能运行在一个核上,这种情况下另外一个核是完全没有发挥作用的,是被浪费的;超线程技术(HT)的情况也类似双核,但没有双核那么彻底。
◎小弟原来测试过双核下多个线程去上传大文件,结果速度并没有比单个线程快多少,是不是因为IO的速度大大限制了?
—— 除了IO速度外,你的多线程模型也很可能是个问题;我见过不少人写出来的多线程代码,实际上都因为某个竞争资源的关系,其实是在不断的轮流着排队执行,表面上看起来似乎是都在并发的做事情,其实比一个线程还差劲。
—— 建议你尝试去写一个哪怕只是简单的:从 1加到10000,总共做1000次;然后你用两个线程各做500次和一个线程做1000次,比较下看看总时间如何就知道了。
—— 当然,由于你是双核CPU,所以4个线程跟2个线程效果是差不多的,原因为啥相信你自己能分析。
------解决方案--------------------密集型时的 IO 操作最好不要使用多线程进行操作
------解决方案--------------------
------解决方案--------------------线程开多了有overhead问题。这个具体情况具体分析。有些简单问题单线程是一定快的,
没有overhead。有些情况开多线程并不是为了效率,而是为了用户体验。不能就一个线程快而其他巨慢。
------解决方案--------------------就比如Node.js和Apache的多线程,不一定说哪个有绝对优势。