多线程真的比单线程执行效率高吗?

问题描述

多线程真的比单线程执行效率高吗?
对于单核CPU下多线程程序在同一时间点都只能有一个线程运行,对于多核CPU可以实现真正的并发同步运行,这种说法正确吗?
另外在多线程的情况下使用互斥对象来实现线程同步,这样的话多线程程序的运行效率受影响吗?

解决方案

比如说,你用多线程并行对一个数组进行累加。你用第一个线程处理前50%,另一个线程处理后50%,最后你需要汇总两个线程的结果,因为种种原因,两个线程肯定不会同时结束。
那么就需要等待全部线程结束,这个等待的过程就等于单线程(先做好的阻塞住等没做好的,同时只有1个在做)
再比如说,你的程序分为10个线程去计算,和上个例子不同,你不关心先后计算的顺序,但是最后要输出到屏幕上,屏幕只有一个,那么在输出屏幕的时候你必须枷锁,保证只有一个线程能输出,如果有别的线程要输出,就得等待。
那么输出的过程同样相当于单线程。

解决方案二:
单核单CPU,并且CPU不支持SMT/HTT,换言之,只有一个逻辑处理器,那么无法并行。
即便单处理器,多线程也可能提高效率(吞吐量),因为除了CPU资源,还有外设、IO、网络,使用多线程可以充分利用这些资源,隐藏延迟。
所谓线程同步,就是线程的阻塞和等待,过度的同步,多线程就相当于回到了单线程。

解决方案三:
1、第一句话一般理论没错,但单核CPU也有超线程技术,超线程技术同一时间点也是可以运行2个线程的。
2、肯定会影响的。因为多了等待互斥变量释放时间。

解决方案四:
多核cpu或者带超线程的CPU都可以同时执行多个线程,这样i 就实现了真正意义上的并行。所以效率高
但如果现场之间要数据交互,有依赖,有同步那么就会造成线程之间等待,加锁。这样就会降低并效率。

解决方案五:
单双核的CPU是有影响的,对于多核的处理器只用单线程的话,资源就浪费了,换句话说就是,充分利用CPU的资源,程序固然跑的快,对于单核cpu,多线程的意义在于那些会发生堵塞的任务,线程在堵塞的时候还能去执行任务,这也算是充分利用了CPU了,当然hello world另说。

时间: 2024-11-02 10:22:18

多线程真的比单线程执行效率高吗?的相关文章

mysql存储过程的学习(mysql提高执行效率之进阶过程)

1:存储过程: 答:存储过程是sql语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理:存储过程存储在数据库内,可以由应用程序调用执行,而且允许用户声明变量以及进行流程控制,存储类型可以接受参数,可以接受输入类型的参数,也可以接受输出类型的参数,并且可以存在多个返回值,因为存储过程的效率要比单一的sql语句执行效率高很多: 注意:存储过程执行效率之所高,在于普通的sql语句,每次都会对语法分析,编译,执行,而存储过程只是在第一次执行语法分析,编译,执行,以后都是对结果进行调用.  2:

多线程和单线程拷贝文件那个效率高

问题描述 多线程和单线程拷贝文件那个效率高 单线程拷贝一个文件和多线程拷贝一个文件,那个效率更高,求大神写个例子证明一下. 解决方案 我菜,不会写,现在下载都是多线程的吧,看资源就知道.... 解决方案二: 拷贝文件的瓶颈在io,而不是cpu,多线程没有任何优势,而且对于机械硬盘,多个拷贝会导致寻道造成的性能损失.固态磁盘两者查不多. 解决方案三: 一提到多线程一般大家的第一感觉就是可以提升程序性能,在实际的操作中往往遇到性能的问题,都尝试使用多线程来解决问题,但多线程程序并不是在任何情况下都能

“List<T>.Contains()"的效率高,还是 foreach循环的效率高?

问题描述 "List<T>.Contains()"的效率高,还是foreach循环的效率高?判断一个对象是否存在于List<T>集合中,是使用"List<T>.Contains()"的效率高,还是foreach循环的效率高???if(DeviceList.Contains(dev)){returnDeviceList.Count;}foreach(IDeviceidinDeviceList){if(id==dev){returnD

如何提高IIS 5.0网站伺服器的执行效率呢?

iis|执行 提高IIS 5.0执行效率 如何提高Windows 2000 Server中IIS 5.0网站伺服器的执行效率呢? 提高IIS执行效率的方法如下: 1. 启用HTTP的持续作用可以改善15~20%的执行效率. 2. 不启用记录可以改善5~8%的执行效率. 3. 使用 [独立] 的处理程序会损失20%的执行效率. 4. 增加快取记忆体的保存档案数量,可提高Active Server Pages之效能. 5. 勿使用CGI程式. 6. 增加IIS 5.0电脑CPU数量. 7. 勿启用A

提高IIS 5.0网站服务器的执行效率的八种方法

iis|服务器|执行 以下是提高IIS 5.0网站服务器的执行效率的八种方法: 1. 启用HTTP的持续作用可以改善15~20%的执行效率. 2. 不启用记录可以改善5~8%的执行效率. 3. 使用 [独立] 的处理程序会损失20%的执行效率. 4. 增加快取记忆体的保存文档数量,可提高Active Server Pages之效能. 5. 勿使用CGI程式. 6. 增加IIS 5.0电脑CPU数量. 7. 勿启用ASP侦错功能. 8. 静态网页采用HTTP 压缩,大约可以减少20%的传输量. 简

提高IIS 5.0网站伺服器的执行效率的八种方法

iis|执行 提高IIS 5.0网站伺服器的执行效率的八种方法 以下是提高IIS 5.0网站伺服器的执行效率的八种方法: 1. 启用HTTP的持续作用可以改善15~20%的执行效率. 2. 不启用记录可以改善5~8%的执行效率. 3. 使用 [独立] 的处理程序会损失20%的执行效率. 4. 增加快取记忆体的保存档案数量,可提高Active Server Pages之效能. 5. 勿使用CGI程式. 6. 增加IIS 5.0电脑CPU数量. 7. 勿启用ASP侦错功能. 8. 静态网页采用HTT

如何提高IIS 5.0网站伺服器的执行效率呢

iis|执行 提高IIS 5.0执行效率 如何提高Windows 2000 Server中IIS 5.0网站伺服器的执行效率呢? 提高IIS执行效率的方法如下: 1. 启用HTTP的持续作用可以改善15~20%的执行效率. 2. 不启用记录可以改善5~8%的执行效率. 3. 使用 [独立] 的处理程序会损失20%的执行效率. 4. 增加快取记忆体的保存档案数量,可提高Active Server Pages之效能. 5. 勿使用CGI程式. 6. 增加IIS 5.0电脑CPU数量. 7. 勿启用A

浅谈代码的执行效率(3):缓存与局部性

在前两篇文章里,我们讨论了程序性能的两个方面,一是算法(广义的算法,即解决问题的方法),二是编译器.通过这两个方面,我想表达的意思是,一段程序的执行效率,是很难从表面现象得出结论的,至少从一些简单的层面,如代码的长度是几乎难以说明任何问题--因此一定要进行Profiling才能做到有效的优化.而现在,我们假设两段程序算法基本相同,编译器也只是进行简单的"翻译",那么--我们能从"表面"看出性能高下吗? 那么就从一个最简单的例子看起吧.假设DoSomethingA和D

浅谈代码的执行效率(2):编译器的威力

在上一篇文章中,我主要表达了这样一个观点:影响程序效率的关键之一是算法,而算法的选择与优化,和是否多一个赋值少一个判断的关系不大.关于算法的选择,我谈到其理论上的复杂度,并不直接反映出效率.因为在实际运用时,数据的规模,特征等等都会涉及到算法的实际效果.一个时间复杂度低的算法并不代表任何情况下的效率都高.这是"实际"和"理论"的区别之一.现在我打算来谈一下另一个比较"实际"的东西:编译器对于程序效率的影响. 那么我们先来看这样一段代码,假设有一个