当前位置:网站首页>多线程一定能优化程序性能吗?
多线程一定能优化程序性能吗?
2022-07-23 10:41:00 【CSDN云计算】

作者 | 陆小风
来源 | 码农的荒岛求生
问:如果一个和尚挑水喝,两个和尚抬水喝,三个和尚没水喝,那么众人拾柴一定火焰高吗?
多线程一定能提高程序性能吗?在计算机科学中,这个问题的标准答案是“it depends”,看情况。
计算机中的一切设计都是为了更加高效的利用硬件资源,包括:CPU、内存、IO等,我们一样一样来了解一下。
多线程与CPU
多线程与CPU是程序员了解的最多的,我们知道多线的目的之一在于充分利用多核,但这里有个前提就是你要处理的任务真的能拆分成独立的子任务。

举个例子,如果你想对一个数组所有元素的和,那么这个任务就可以拆分成为两个独立的子任务:任务A计算前一半数组元素的和,任务B计算后一半数组元素的和,然后任务A和任务B分别交给两个线程来执行。
如果是在多核系统下这类多线程并行处理将显著提高程序性能,但这种使用多线程充分利用多核带来的性能提升是有上限的。
道理很简单,这就好比盖房子,盖房子算是个不大不小的工程,让一个人来完成也不是不可以,但再来六七个人显然能加快工程速度,但是再来成百上千工人来盖一栋房子可能速度反而会变慢,毕竟资源是有限的(可用的工具等),人一多需要用在协调上的时间就会变多,多线程也是同样的道理,当线程数量超过某个临界点时操作系统就开始忙不过来了(频繁调度切换),我称之为三个和尚没水喝现象。

但如果系统是单核的,那么这种任务拆分则不会有什么效果,因为不管你创建多少线程真正工作的CPU只有一个。
当然也有可能我们根本就不能对任务进行拆分,像计算斐波那契数列这类问题,如果你不能计算出f(n-1)与f(n-2)的解,那么你根本就没有办法计算出当前问题f(n)的解,被拆分的两个任务A和B有前后依赖关系,这时多线程就没有用武之地了。
还有一种可能,就是你的问题规模非常小,如果这个数组是有几百几千个元素,那么这时你使用多线程意义不大,这时使用多线程带来的收益不足以抵消掉多线程带来的性能开销。
多线程与IO
多线程一定能提升程序的IO性能吗?答案显然不是的。
最简单的场景是这样的,你的程序需要从一个速度极慢的网络链接上读写数据,在这种情况下一个线程很可能就足以应付的过来,创建多个线程反而可能对程序性能有损。
相同的情况也会出现在磁盘上,一个线程可能就已经将磁盘打满,这时创建多个线程去读写文件显然不能加快程序的处理速度。

而在服务器端,程序员也使用多线程加快程序处理速度,在这里,一个典型的问题是阻塞式网络IO会导致调用线程被挂起而暂停运行,此时最简单的方法就是创建多个线程,每个线程处理一个请求,但随着请求的增多创建的线程也会越来越多,此时三个和尚没水喝现象开始出现,IO多路复用技术可以很好的解决这一问题。
当然,如果你的场景是IO会阻塞住处理线程,那么此时创建两个线程,一个负责处理数据,一个负责等待IO,那么这显然会提高程序性能。
多线程与内存
内存其实和磁盘一样,也是有读写带宽上限的,但我们的程序一般都不会达到内存读写带宽上限,这并不是瓶颈。
瓶颈在于多线程共享的内存资源(数据)以及多核系统的cache一致性问题。
一般来说,对于多线程共享资源通常需要互斥访问,然而为加快内存读写速度,现代处理器中都有cache系统(L1、L2、L3),每个核心都有自己的cache,这些cache会缓存内存数据,也就是说一份数据可能会同时存在于内存以及各个核心的cache中,这就会带来经典的数据一致性问题:某个核心修改了cache中的数据后需要将其同步给其它核心,这就要求cache系统中必须有能确保一致性的协议,否则程序可能会读取到错误的(过期的)数据。

然而这种同步是有性能损耗的,多个线程频繁操作同一个变量可能导致处理器cache系统需要频繁在各个核心之间进行同步,极端情况下多线程程序性能甚至比单线程要差。
因此多线程之间能不共享数据就不要共享,如果一定要共享,那么就尽量将其控制在最小范围,读写频次控制到最少。

往期推荐
掌握 Dowanward API 的妙用,轻松拿捏 kubernetes 环境变量

点分享

点收藏

点点赞

点在看
边栏推荐
- Live classroom system 01 database table design
- RTA一种广告精准投放的新玩法?
- Skills to learn before going to primary school
- VMware虚拟机下载安装使用教程
- The problem of double type precision loss and its solution
- 安全合理用电 收获清凉一“夏”
- 颜值爆表 Redis官方可视化工具来啦,针不戳
- Multiple backpacks!
- Simulink simulation of ESP three-phase SVPWM controller
- day18
猜你喜欢
![[untitled]](/img/6c/df2ebb3e39d1e47b8dd74cfdddbb06.gif)
[untitled]

Redis | 非常重要的中间件

安全作业7.22

Simulation de modulation et de démodulation du signal CBOC basée sur MATLAB, sortie de corrélation, spectre de puissance et suivi de décalage de fréquence

Matlab simulation of depth information extraction and target ranging based on binocular camera images

Activity的启动流程

Cloud native observability tracking technology in the eyes of Baidu engineers

基于matlab的BOC调制信号捕获仿真

如何加速矩阵乘法——优化GEMM (CPU单线程篇)

精品国创《少年歌行》数字藏品开售,邀你共铸少年武侠江湖梦
随机推荐
Postgresql快照优化Globalvis新体系分析(性能大幅增强)
js判断元素是否到滚动到顶部
多项式承诺Polynomial commitment方案汇总
【OpenCV 例程200篇】225. 特征提取之傅里叶描述子
【启发式分治】启发式合并的逆思想
The accuracy of digital addition
Common SQL of Oracle Report
The best time to buy and sell stocks
C# 计算某个字符在字符串中出现的次数
NVIDIA vid2vid paper reproduction
第四章 使用 %REST.API 类创建 REST 服务
如何实现多个传感器与西门子PLC之间485无线通讯?
爬虫中selenium实现自动给csdn博主文章点收藏
double类型精度丢失问题以及解决方法
Smart headline: smart clothing forum will be held on August 4, and the whole house smart sales will exceed 10billion in 2022
VSCode 更新後與tab相關快捷鍵無法使用
How to realize 485 wireless communication between multiple sensors and Siemens PLC?
pytorch opencv pil图像预处理比较
颜值爆表 Redis官方可视化工具来啦,针不戳
Dynamic planning - force buckle