多线程一定能优化程序性能吗?

b33a223cca385602184511b0fb2fce6e.gif

作者 | 陆小风

来源 | 码农的荒岛求生

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

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

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

多线程与CPU

多线程与CPU是程序员了解的最多的,我们知道多线的目的之一在于充分利用多核,但这里有个前提就是你要处理的任务真的能拆分成独立的子任务。

431273dd0629be64e9934ffbdda37750.png

举个例子,如果你想对一个数组所有元素的和,那么这个任务就可以拆分成为两个独立的子任务:任务A计算前一半数组元素的和,任务B计算后一半数组元素的和,然后任务A和任务B分别交给两个线程来执行。

如果是在多核系统下这类多线程并行处理将显著提高程序性能,但这种使用多线程充分利用多核带来的性能提升是有上限的。

道理很简单,这就好比盖房子,盖房子算是个不大不小的工程,让一个人来完成也不是不可以,但再来六七个人显然能加快工程速度,但是再来成百上千工人来盖一栋房子可能速度反而会变慢,毕竟资源是有限的(可用的工具等),人一多需要用在协调上的时间就会变多,多线程也是同样的道理,当线程数量超过某个临界点时操作系统就开始忙不过来了(频繁调度切换),我称之为三个和尚没水喝现象。

699775927abb6996bc05949926f51a45.png

但如果系统是单核的,那么这种任务拆分则不会有什么效果,因为不管你创建多少线程真正工作的CPU只有一个。

当然也有可能我们根本就不能对任务进行拆分,像计算斐波那契数列这类问题,如果你不能计算出f(n-1)与f(n-2)的解,那么你根本就没有办法计算出当前问题f(n)的解,被拆分的两个任务A和B有前后依赖关系,这时多线程就没有用武之地了。

还有一种可能,就是你的问题规模非常小,如果这个数组是有几百几千个元素,那么这时你使用多线程意义不大,这时使用多线程带来的收益不足以抵消掉多线程带来的性能开销。

多线程与IO

多线程一定能提升程序的IO性能吗?答案显然不是的。

最简单的场景是这样的,你的程序需要从一个速度极慢的网络链接上读写数据,在这种情况下一个线程很可能就足以应付的过来,创建多个线程反而可能对程序性能有损。

相同的情况也会出现在磁盘上,一个线程可能就已经将磁盘打满,这时创建多个线程去读写文件显然不能加快程序的处理速度。

26986bf2fa0de8bffad63220ed7cd6b9.png

而在服务器端,程序员也使用多线程加快程序处理速度,在这里,一个典型的问题是阻塞式网络IO会导致调用线程被挂起而暂停运行,此时最简单的方法就是创建多个线程,每个线程处理一个请求,但随着请求的增多创建的线程也会越来越多,此时三个和尚没水喝现象开始出现,IO多路复用技术可以很好的解决这一问题。

当然,如果你的场景是IO会阻塞住处理线程,那么此时创建两个线程,一个负责处理数据,一个负责等待IO,那么这显然会提高程序性能。

多线程与内存

内存其实和磁盘一样,也是有读写带宽上限的,但我们的程序一般都不会达到内存读写带宽上限,这并不是瓶颈。

瓶颈在于多线程共享的内存资源(数据)以及多核系统的cache一致性问题。

一般来说,对于多线程共享资源通常需要互斥访问,然而为加快内存读写速度,现代处理器中都有cache系统(L1、L2、L3),每个核心都有自己的cache,这些cache会缓存内存数据,也就是说一份数据可能会同时存在于内存以及各个核心的cache中,这就会带来经典的数据一致性问题:某个核心修改了cache中的数据后需要将其同步给其它核心,这就要求cache系统中必须有能确保一致性的协议,否则程序可能会读取到错误的(过期的)数据。

85dd1b5f7e8ac480668ae7cd774fc302.png

然而这种同步是有性能损耗的,多个线程频繁操作同一个变量可能导致处理器cache系统需要频繁在各个核心之间进行同步,极端情况下多线程程序性能甚至比单线程要差。

因此多线程之间能不共享数据就不要共享,如果一定要共享,那么就尽量将其控制在最小范围,读写频次控制到最少。

28849da31885f03c83bbdabe54610707.gif

往期推荐

Docker 那些事儿:如何安全地停止、删除容器?

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

云原生时代,开发者应具备这5大能力

实战 Kubectl 创建 Deployment 部署应用

f3b4cc46500265b0c13656905bb8ecdd.gif

点分享

f7a7ac79280511e439880f704694edd0.gif

点收藏

e901543449210b40fc722cab0a59978a.gif

点点赞

2d354dcaa418813a426cc80c6129516a.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4种常见分支模式解析及优劣对比

简介:团队研发的本质并不是团队规模越大,研发的效率就越高。我们以为团队规模越大,研发效率就会越高,可以做越多的东西,但是我们发现团队规模大到一定程度,整个研发效率是会下降的,甚至降得非常…

重构知识的供给模式 ——《数据平台》从思考到落地

简介:如何去建立一套 “高度自动化&体系化的知识管理系统,重构知识的供给模式”。是不是看不懂?而且有点冲?是不是谜语人附体?别急,本文作者将会做详细的说明。 作者 | 七惜 来源 | 阿里技术公众号 一…

PolarDB for PostgreSQL 内核解读 :HTAP架构介绍

简介:在 PolarDB 存储计算分离的架构基础上我们研发了基于共享存储的MPP架构步具备了 HTAP 的能力,对一套 TP的数据支持两套执行引擎:单机执行引擎用于处理高并发的 OLTP;MPP跨机分布式执行引擎用于复杂的 OLAP 查询,发…

kubernetes 的这几种存储卷,别再傻傻分不清了

作者 | 江小南来源 | 江小南和他的小伙伴们存储卷类型Kubernetes提供的存储卷(volume)属于Pod资源,共享于Pod内的所有容器,存储卷可在容器的文件系统之外存储相关的数据,也可以独立于Pod的生命周期实现数据持久化存储。…

这群人,用8年讲述体育能有多迷人

望尘科技:专注体育娱乐在线体验的自主研发,致力于让体育迷获得高品质的沉浸式体验。用科技致敬体育,是他们坚持的信仰。 客户故事 望尘科技一心专注深耕体育游戏。他们把自己的计算中心搬到了云上,借助阿里云数字基础设施为程序…

成中集团线下IDC迁移上云

阿里云根据成中集团业务场景入手,提供了上云方案和迁移建议,利用这套架构,保障了公司数据的安全性并且满足了公司对于备份机制的建立的基本诉求,并且降低了业务出现中断的风险。 公司介绍 成中简介: 我们公司是一家…

什么是hpaPaaS平台?

作者 | Gordon Van Huizen,Mendix公司平台战略高级副总裁 供稿 | Mendix Gartner为两种云端应用开发方法创造了两个名称:高生产力应用程序平台即服务(hpaPaaS)和高控制应用平台即服务(hcaPaaS)。本文将对二…

重新认识访问者模式:从实践到本质

简介:访问者模式在设计模式中的知名度虽然不如单例模式,但也是少数几个大家都能叫得上名字的设计模式了。不过因为访问者模式的复杂性,人们很少在应用系统中使用,经过本文的探索,我们一定会产生新的认识,发…

3个案例,详解如何选择合适的研发模式

简介:3个案例,详解如何选择合适的研发模式,研发模式的选择与产品形态、发布方式、团队规模、协作成熟度密切相关。本文我们将根据不同的团队场景,分析如何选择适合团队的研发模式。 策划&编辑|雅纯 上一讲&#x…

如何打造一款极速数据湖分析引擎

简介:本文向读者详细揭秘了数据湖分析引擎的关键技术,并通过 StarRocks 来帮助用户进一步理解系统的架构。 作者: 阿里云 EMR 开源大数据 OLAP 团队 StarRocks 社区数据湖分析团队 前言 随着数字产业化和产业数字化成为经济驱动的重要动…

如何在 Linux 命令行中按大小对文件进行排序

作者 | 刘光录来源 | TIAPls 命令用于显示目录的内容。使用 -l 选项,可以列出文件和目录及其属性。今天我们来分享一下如何根据文件大小对列表进行排序。ls -l 命令可以显示文件大小,但也仅仅是能让我们看到文件的大小,它默认是按照字母顺序显…

福建品品香茶业有限公司业务迁移上云

福建品品香茶业有限公司数据量较大,进行业务迁移上云时阿里云根据其公司需求综合考虑,推荐将原有IOE架构改为分布式架构,使用ECSRDS承载业务,为客户带来极大价值。 企业介绍 福建品品香茶业有限公司是一家集茶叶种植、加工、销售…

璀璨智行:V2X车路协同智慧交通

V2X车用无线通信技术是指车对外界的信息交换,作为未来智能交通运输系统的关键技术,璀璨智行潜心研究V2X技术,致力于V2X车路协同的落地,在智慧交通领域做出了卓越的贡献。 创业机会点 魏军博表示:“面对交通系统效率低…

Databricks 企业版 SparkDelta Lake 引擎助力 Lakehouse 高效访问

简介:本文介绍了Databricks企业版Delta Lake的性能优势,借助这些特性能够大幅提升Spark SQL的查询性能,加快Delta表的查询速度。 作者: 李锦桂(锦犀) 阿里云开源大数据平台开发工程师 王晓龙&#xff08…

深度解析数据湖存储方案Lakehouse架构

简介:从数据仓库、数据湖的优劣势,湖仓一体架构的应用和优势等多方面深度解析Lakehouse架构。 作者:张泊 Databricks 软件工程师 Lakehouse由lake和house两个词组合而成,其中lake代表Delta Lake(数据湖)&…

1688 复杂业务场景下的 Serverless 提效实践

简介:我们主要负责 PC 端 1688.com 以及手机端阿里巴巴 APP,是目前国内最大的 B 类电商交易平台,主要面向 B2B 电商业务的场景,为中小企业提供零售、批发、分销以及加工定制等电商交易渠道。 前言 首先为大家简单介绍一下我们的…

阿里 蚂蚁自研 IDE 研发框架 OpenSumi 正式开源

简介:经历近 3 年时间,在阿里集团及蚂蚁集团共建小组的努力下,OpenSumi 作为国内首个强定制性、高性能,兼容 VS Code 插件体系的 IDE 研发框架,今天正式对外开源。 作者 | OpenSumi 来源 | 阿里技术公众号 经历近 3 …

剖析 kubernetes 集群内部 DNS 解析原理

作者 | 江小南来源 | 江小南和他的小伙伴们引言说到DNS域名解析,大家想到最多的可能就是/etc/hosts文件,并没有什么错,但是/etc/hosts只能做到本机域名解析,如果跨机器的解析就有点捉襟见肘了。在服务器中还有一个配置值得大家注意…

首次公开,阿里云开源PolarDB总体架构和企业级特性

简介:在3月2日的阿里云开源 PolarDB 企业级架构发布会上,阿里云 PolarDB 内核技术专家北侠带来了主题为《PolarDB 总体架构设计和企业级特性》的精彩演讲。 在3月2日的阿里云开源 PolarDB 企业级架构发布会上,阿里云 PolarDB 内核技术专家 北…

阿里云数据库开源发布:PolarDB HTAP的功能特性和关键技术

简介:在3月2日的阿里云开源 PolarDB 企业级架构发布会上,阿里云 PolarDB 内核技术专家严华带来了主题为《PolarDB HTAP详解》的精彩演讲。在PolarDB存储计算分离架构的基础上,我们研发了基于共享存储的MPP分布式执行引擎,解决了单…