首页 > 其他分享 >为什么多线程会带来性能问题?

为什么多线程会带来性能问题?

时间:2024-09-03 15:28:26浏览次数:6  
标签:为什么 上下文 性能 调度 线程 切换 多线程


为什么多线程会带来性能问题?

什么是性能问题

在上一篇中,我们已经学习了多线程带来的线程安全问题,但对于多线程而言,它不仅可能会带来线程安全问题,还有可能会带来性能问题,也许你会奇怪,我们使用多线程的最大目的不就是为了提高性能吗?让多个线程同时工作,加快程序运行速度,为什么反而会带来性能问题呢?这是因为单线程程序是独立工作的,不需要与其他线程进行交互,但多线程之间则需要调度以及合作,调度与合作就会带来性能开销从而产生性能问题。

首先,我们来了解究竟什么是性能问题?其实性能问题有许多的表现形式,比如服务器的响应慢、吞吐量低、内存占用过多就属于性能问题。我们设计优秀的系统架构、购置更多的 CDN 服务器、购买更大的带宽等都是为了提高性能,提高用户体验,虽然运行速度慢不会带来严重的后果,通常只需要我们多等几秒就可以,但这会严重影响用户的体验。有研究表明,页面每多响应 1 秒,就会流失至少 7% 的用户,而超过 8 秒无法返回结果的话,几乎所有用户都不会选择继续等待。我们引入多线程的一大重要原因就是想提高程序性能,所以不能本末倒置,不能因为引入了多线程反而程序运行得更慢了,所以我们必须要解决多线程带来的性能问题。

为什么多线程会带来性能问题

那么什么情况下多线程编程会带来性能问题呢?主要有两个方面,一方面是线程调度,另一个方面是线程协作。

调度开销

上下文切换

首先,我们看一下线程调度,在实际开发中,线程数往往是大于 CPU 核心数的,比如 CPU 核心数可能是 8 核、16 核,等等,但线程数可能达到成百上千个。这种情况下,操作系统就会按照一定的调度算法,给每个线程分配时间片,让每个线程都有机会得到运行。而在进行调度时就会引起上下文切换,上下文切换会挂起当前正在执行的线程并保存当前的状态,然后寻找下一处即将恢复执行的代码,唤醒下一个线程,以此类推,反复执行。但上下文切换带来的开销是比较大的,假设我们的任务内容非常短,比如只进行简单的计算,那么就有可能发生我们上下文切换带来的性能开销比执行线程本身内容带来的开销还要大的情况。

缓存失效

不仅上下文切换会带来性能问题,缓存失效也有可能带来性能问题。由于程序有很大概率会再次访问刚才访问过的数据,所以为了加速整个程序的运行,会使用缓存,这样我们在使用相同数据时就可以很快地获取数据。可一旦进行了线程调度,切换到其他线程,CPU就会去执行不同的代码,原有的缓存就很可能失效了,需要重新缓存新的数据,这也会造成一定的开销,所以线程调度器为了避免频繁地发生上下文切换,通常会给被调度到的线程设置最小的执行时间,也就是只有执行完这段时间之后,才可能进行下一次的调度,由此减少上下文切换的次数。

那么什么情况会导致密集的上下文切换呢?如果程序频繁地竞争锁,或者由于 IO 读写等原因导致频繁阻塞,那么这个程序就可能需要更多的上下文切换,这也就导致了更大的开销,我们应该尽量避免这种情况的发生。

协作开销

除了线程调度之外,线程协作同样也有可能带来性能问题。因为线程之间如果有共享数据,为了避免数据错乱,为了保证线程安全,就有可能禁止编译器和 CPU 对其进行重排序等优化,也可能出于同步的目的,反复把线程工作内存的数据 flush 到主存中,然后再从主内存 refresh 到其他线程的工作内存中,等等。这些问题在单线程中并不存在,但在多线程中为了确保数据的正确性,就不得不采取上述方法,因为线程安全的优先级要比性能优先级更高,这也间接降低了我们的性能。

为什么多线程会带来性能问题?_开发语言


标签:为什么,上下文,性能,调度,线程,切换,多线程
From: https://blog.51cto.com/xiaobear/11908589

相关文章

  • 钢铁百科:A633GrE钢板材质、A633GrE力学性能、A633GrE执行标准
    A633GrE钢板是一种美标低合金高强度结构钢板,具有多种优异的性能和应用领域。以下是对其材质、执行标准、化学成分、力学性能、交货状态、应用范围、常用规格及总结的详细介绍:一、A633GrE材质A633GrE钢板属于美标低合金钢,具有高强度、高韧性和良好的焊接性能。这种钢板常用于......
  • 钢铁百科:A633E执行标准、A633E力学性能、A633E交货状态
    A633E钢板是一种结构用低合金高强度钢板,具有优异的力学性能、焊接性能和耐腐蚀性能,被广泛应用于多个领域。一、A633E执行标准A633E钢板的材质属于低合金高强度钢,其执行标准为ASTM(美国材料与试验协会)标准。二、A633E化学成分这种钢板通过添加适量的合金元素,如碳、硅、锰、磷......
  • 基于 Zynq-7 的高性能 PCIe 载板
    基于Zynq-7的高性能PCIe载板是一款高性能PCIe2.0X8的载板,板载1个HPC形式的FMC连接器。主控芯片采用Xilinx公司Zynq-7系列SoC家族中的XC7Z100-2FFG900I(兼容XC7Z045-2FFG900和XC7Z035-2FFG900)。其PS搭配2颗16bit-1866的512MBDDR3SDRAM和一片256Mb......
  • 业务部门提出我们已经有报表了为什么还要上BI? | BI与报表区别和联系?
    目录0业务质疑 1认知提升 (1)什么是BI(2)BI与大数据有什么关系?(3)BI与信息化、数字化之间的有什么关系? (4)BI与报表之间的区别2企业数据应用现状及BI价值(1)企业数据应用现状(2)BI价值体现 3小结0业务质疑    在数字化建设过程中,IT部门在进行BI项目推进的时......
  • DzzOffice PHP 性能优化
    PHP的优势之一是其高速执行能力,然而,我们不应因此忽视对PHP代码进行优化处理的重要性。未经优化的逻辑将导致整个程序执行效率的降低。以下是对几个常见问题的分析:文件绝对路径在includes和requires中使用绝对路径,这样在分析路径花的时间更少。循环与函数在循环里别用函数,例......
  • 为什么很多软件安装完要求重启电脑以使设置生效
    概述在安装完某些软件之后,我们经常会看到“请重启电脑以使设置生效”之类的提示,这背后有什么原因吗?猜测既然某些设置需要重启电脑以使之生效,即表示这些设置需要在系统启动时才能将数据导入或者写入某些内存区域中,也即表示在当前运行的操作系统中,普通应用程序不具有向这些内存......
  • 为什么很多人会选择学网络安全?前景如何?
    “网络安全”是当下十分热门的热词,受到了国家的高度重视与关注,并有关政策。在此背景之下,为了寻求新的职业发展机会,越来越多的朋友将目光聚焦于网络安全行业,那么为什么学习网络安全?网络安全课程前景如何?相信很多人都有所疑惑,接下来小编带你详细了解一下。为什么学习网络安......
  • 【Geeksend邮件营销】为什么在发送邮件前要进行邮箱预热?
    发邮件前进行邮箱预热是一个重要的步骤,主要原因有以下几点:提高邮件发送成功率:许多邮件服务提供商(例如Gmail、Outlook等)使用复杂的算法来识别和过滤垃圾邮件或来自不可靠发件人的邮件。而邮箱预热不仅是一个短期的过程,更是一种长期的策略。通过逐步增加邮件发送量和活跃度,你可......
  • WPF性能优化之UI虚拟化
    @目录前言一、VirtualizingStackPanel1.1虚拟化功能介绍1、在Window中添加一个ListBox控件。2、在设计视图中用鼠标选中ListBox控件并右健依次单击“编辑其他模板”-“编辑项的布局模板”-“编辑副本”。3、查看生成的模板代码。1.2虚拟化参数介绍二、CustomVirtualizingPanel2.1......
  • WPF性能优化之UI虚拟化
    前言相信很多WPF开发者都碰到过这种情况,当在一个ItemsControl(或继承自ItemsControl)控件中绑定一个集合的时候,如果集合中的条目过多,那么界面就会变得卡顿甚至停止响应,特别是在容器或窗口大小发生改变时,界面的渲染就会给人一种慢半拍的感觉,体验感非常差,这时我们就可以用虚拟化技术......