0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

多线程一定能提高程序性能吗

lhl545545 来源:良许Linux 作者:良许Linux 2022-09-26 10:31 次阅读

问:如果一个和尚挑水喝,两个和尚抬水喝,三个和尚没水喝,那么众人拾柴一定火焰高吗?

多线程一定能提高程序性能吗?在计算机科学中,这个问题的标准答案是“it depends”,看情况。

计算机中的一切设计都是为了更加高效地利用硬件资源,包括:CPU、内存、IO等,我们一样一样来了解一下。

多线程与CPU

多线程与CPU是程序员了解得最多的,我们知道多线程的目的之一在于充分利用多核,但这里有个前提就是你要处理的任务真的能拆分成独立的子任务。 举个例子,如果你想求一个数组所有元素的和,那么这个任务就可以拆分成为两个独立的子任务:任务A计算前一半数组元素的和,任务B计算后一半数组元素的和,然后任务A和任务B分别交给两个线程来执行。 如果是在多核系统下,这类多线程并行处理将显著提高程序性能,但这种使用多线程充分利用多核带来的性能提升是有上限的。 道理很简单,这就好比盖房子,盖房子算是个不大不小的工程,让一个人来完成也不是不可以,但再来六七个人显然能加快工程速度,但是再来成百上千工人来盖一栋房子可能速度反而会变慢,毕竟资源是有限的(可用的工具等),人一多需要用在协调上的时间就会变多,多线程也是同样的道理,当线程数量超过某个临界点时,操作系统就开始忙不过来了(频繁调度切换),我称之为三个和尚没水喝现象。 24d6d272-3bae-11ed-9e49-dac502259ad0.png 但如果系统是单核的,那么这种任务拆分则不会有什么效果,因为不管创建多少线程,真正工作的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系统中必须有能确保一致性的协议,否则程序可能会读取到错误的(过期的)数据。 250bb0dc-3bae-11ed-9e49-dac502259ad0.png 然而这种同步是有性能损耗的,多个线程频繁操作同一个变量可能导致处理器cache系统需要频繁在各个核心之间进行同步,极端情况下多线程程序性能甚至比单线程要差。 因此多线程之间能不共享数据就不要共享,如果一定要共享,那么就尽量将其控制在最小范围,读写频次控制到最少。  

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10843

    浏览量

    211417
  • 计算机
    +关注

    关注

    19

    文章

    7467

    浏览量

    87812
  • 内存
    +关注

    关注

    8

    文章

    3009

    浏览量

    73957
  • 多线程
    +关注

    关注

    0

    文章

    278

    浏览量

    19936

原文标题:多线程一定能优化程序性能吗?

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Java多线程的用法

    本文将介绍下Java多线程的用法。 基础介绍 什么是多线程 指的是在个进程中同时运行多个线程,每个线
    的头像 发表于 09-30 17:07 940次阅读

    多线程的过程程序

    1、多线程了解线程之前我们必须要先了解(程序—>进程—>线程)的过程程序:是组计算机能识别和执
    发表于 08-24 08:28

    改进的多线程应用程序调试(Altium Designer版本10)

    Altium Designer 版本10的发布为POSIX多线程库的支持带来了系列改进 允许多线程应用程序种直观流畅的方式调试。
    发表于 05-15 12:49 1391次阅读
    改进的<b class='flag-5'>多线程</b>应用<b class='flag-5'>程序</b>调试(Altium Designer版本10)

    多线程与聊天室程序的创建

    多线程程序的编写,多线程应用中容易出现的问题。互斥对象的讲解,如何采用互斥对象来实现多线程的同步。如何利用命名互斥对象保证应用程序只有
    发表于 05-16 15:22 0次下载

    7个好习惯快速提升Python程序性能

    使用局部变量替换模块名字空间中的变量,例如 ls = os.linesep。方面可以提高程序性能,局部变量查找速度更快;另方面可用简短标识符替代冗长的模块变量,提高可读性。
    发表于 07-07 10:05 975次阅读
    7个好习惯快速提升Python<b class='flag-5'>程序性能</b>

    C#多线程技术

    程序中,在线程必须等待的时候,CPU可以运行其他线程而不是等待,这就大大提高程序的效率。
    发表于 04-23 11:32 15次下载

    利用矢量硬件如何提高应用程序性能

    本次会议演示了识别和修改代码以利用矢量硬件的过程如何提高应用程序性能
    的头像 发表于 05-31 11:46 1276次阅读

    Java教程之零点起飞学Java的线程资料说明

    多线程编程是提高应用程序性能的重要手段之。Java平台从开始就被设计成为多线程环境,从语言级上支持多线
    发表于 02-20 10:41 3次下载
    Java教程之零点起飞学Java的<b class='flag-5'>线程</b>资料说明

    如何通过多线程并发设计来提高应用程序性能

    这里我们简单总结了下,在现代多处理器或多内核环境下,如何通过多线程并发设计来提高我们应用程序性能和响应性。
    的头像 发表于 09-28 02:13 5288次阅读

    PGO到底是什么?PGO如何提高应用程序性能呢?

    PGO到底是什么?PGO如何提高应用程序性能呢? PGO,全称为Profile Guided Optimization,译为“基于特征优化”的技术,是种通过利用应用程序的运行特征数据
    的头像 发表于 10-26 17:37 2046次阅读

    多线程如何保证数据的同步

    多线程编程是种并发编程的方法,意味着程序中同时运行多个线程,每个线程可独立执行不同的任务,共享同
    的头像 发表于 11-17 14:22 1191次阅读

    mfc多线程编程实例

    (图形用户界面)应用程序的开发。在这篇文章中,我们将重点介绍MFC中的多线程编程。 多线程编程在软件开发中非常重要,它可以实现程序的并发执行,提高程
    的头像 发表于 12-01 14:29 1465次阅读

    你还是分不清多进程和多线程吗?文搞懂!

    你还是分不清多进程和多线程吗?文搞懂! 多进程和多线程是并发编程中常见的两个概念,它们都可以用于提高程序性能和效率。但是它们的实现方式和
    的头像 发表于 12-19 16:07 551次阅读

    java实现多线程的几种方式

    Java实现多线程的几种方式 多线程是指程序中包含了两个或以上的线程,每个线程都可以并行执行不同的任务或操作。Java中的
    的头像 发表于 03-14 16:55 641次阅读

    socket 多线程编程实现方法

    是指在同个进程中运行多个线程,每个线程可以独立执行任务。线程共享进程的资源,如内存空间和文件句柄,但每个线程有自己的
    的头像 发表于 11-12 14:16 288次阅读