您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

充分榨干 CPU 的每一个 TICK:软件性能优化方法知多少

时间:2020-12-09 10:37:21  来源:  作者:

前言

伴随着互联网的快速发展,数据的规模及软件的复杂程度呈指数级增长,带来的硬件资源开销、能源消耗也越来越大。为了控制硬件成本,也为了支持更大的并发量,软件性能的优化工作也越来越重要。接下来,本文将从“充分了解 CPU”、“深入理解编译器”、“对你的代码负责”三个方面详细、全面介绍下软件性能优化的原理及相关方法。文章最后给出总结:性能优化的时机、性能优化的注意事项及性能优化需要的工具有哪些。

1 充分了解 CPU

系统的 CPU 理论知识太多、太复杂,包括 CPU 架构、运算单元、记忆单元、控制单元、数据总线、指令周期、多核、超线程等等,这里只讲三个性能优化时常见的概念:cache、寄存器和多线程。

  • cache

关于 cache,你只要记住一点:CPU 在执行任务的时候,从 cache 读取数据的速度远远大于从内存读取数据的速度。而程序在执行时,会有数据 cache miss 和指令 cache miss。cache 的容量决定了有多少代码和数据可以放到 cache里面,我们优化程序的目标是把程序(代码段)尽可能放到 cache 里面,读取数据时,尽可能做到 cache 里的数据都是要用的。涉及的手段有:

结构体变量字节对齐

预取(prefetch):提前获取下一阶段程序执行需要的数据

函数重排:获取程序运行轨迹,重排二进制目标文件(elf 文件)里的代码段

函数冷热分区

  • 寄存器

控制函数入参个数(对有的硬件而言,当函数入参不超过 4 个时,入参是放在寄存器里的,寄存器读取速度那是相当快滴)。

  • 多线程

多线程是充分利用 CPU 多核优势,避免 I/O 时 CPU 闲置。这里一个重要的性能瓶颈点是:锁。如何定位锁的开销?这里可以大致给你个数据,一般单次加解锁 100 cycles,spinlock 或者 cas 更快点。多线程场景下,如果 CPU 利用率上不去,而系统吞吐量也上不去,那么大概率时锁导致的性能下降。

2 深入理解编译器

避免过多的函数跳转,请使用内联函数和函数宏;

编译器自带的优化项,比如 gcc -O3 等;

32 位环境里面用 64 位 counter 很显然会影响性能,所以除非必要,最好别用;

使用静态内存替代堆内存,,可以做到提前分配;

利用编译器自带的优化工具,做好分支预测。

3 对你的每一行代码负责

算法的重要性相必大家都很清楚了,每个人都能想到这一点,好的算法能带来性能数量级上提升。这里,推荐一种最简单也是最有效的手段:查表,内存足够的话,数组性能最高。

不要做额外的事情,特别是无用的事情,避免重复计算。

内存池能大量减少内存碎片。

理清多条件判断的顺序,尽量在最外层条件判断时就能有结果。

除了上述三点之外,还有 I/O 优化、网络通信时间优化、硬件加速(使用专有硬件,将部分软件功能下沉到硬件)、优化代码流程等方法。

总结:

  • 性能优化的时机

当你遇到性能瓶颈时,你就不得不做性能优化了。在一些软件竞赛时,特别明显,除了比拼算法(软件大赛题目一般都是 NP-hard 问题,主要看谁的程序模拟的轮次更多、更有效),剩下的就是要如何榨干 CPU 的每一个 TICK。

  • 性能优化的工具

善用 perf(linux 自带的工具,采集程序运行时的线程、函数等开销)及生成火焰图(图形显示函数调用栈及 CPU 占用率)。具体的使用方法,各位同学自行学习哈,还有 top -H、ps -aux 等常用命令。

  • 性能优化的注意事项

性能优化时,不能破坏原有的程序功能,更不能引入新的 bug。

要平衡好程序性能和代码美观度及可读性之间的关系。

性能优化要按照软件重构的步骤:

一个时刻只戴一顶帽子;可观察行为保持;小步前进

最后,引用大神 Kent Beck 的一句话作为文章的结尾:“你可能不会成为一个伟大的程序员,但是你可以成为一个具有伟大习惯的好程序员。”

充分榨干 CPU 的每一个 TICK:软件性能优化方法知多少

 



Tags:软件   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
说到远程控制,首先你会想到的是什么?是TeamViewer 还是向日葵?抑或是QQ远程还是anydesk?对,就在不久前,我们熟知的都是以上的产品,但是只2020年开始,一款新的远控产品ToDesk进入到我...【详细内容】
2021-12-27  Tags: 软件  点击:(1)  评论:(0)  加入收藏
手机用了一段时间后会发现,速度越来越慢,这是怎么回事儿呢?这就是我们今天要讲的内容,手机后台运行的软件过多,会直接拖慢手机速度,所以一定要定期清理手机中不必要的后台运行软件...【详细内容】
2021-12-24  Tags: 软件  点击:(6)  评论:(0)  加入收藏
MacBook上有不少像IINA、Downie等强大的神器,有像预览、文档编辑等基础软件,也有一些像快捷指令、Automator以及活动监视器等这样一些效率工具软件。 但是在大部分时候,Mac上自...【详细内容】
2021-12-23  Tags: 软件  点击:(16)  评论:(0)  加入收藏
昨日谷歌宣布,自2022年12月19日开始停止对OnHub的软件支持,OnHub路由器仍将提供Wi-Fi信号,但用户无法用谷歌Home应用程序管理它。无法更新Wi-Fi网络设置、添加额外的Wifi设备或...【详细内容】
2021-12-22  Tags: 软件  点击:(5)  评论:(0)  加入收藏
已经观察到一种新的基于JavaScript的远程访问木马(RAT)利用社会工程学传播,采用隐蔽的"无文件"技术作为其逃避检测和分析的方法。该恶意软件由Prevalyion的对抗性反情报团队(PA...【详细内容】
2021-12-17  Tags: 软件  点击:(13)  评论:(0)  加入收藏
作为一位经常出差的职场打工人,花式打车可是我们的职场必修技能! 如何能又快又实惠的打车?保证安全的同时又能保证方便快捷。 滴滴下架后,我又发现了这5个便宜又好用的打车软件...【详细内容】
2021-12-17  Tags: 软件  点击:(11)  评论:(0)  加入收藏
推荐12款不用安装就能免费用的神仙软件,每一款都是百里挑一! 一、文件存储与传输1.不限量网盘地址:https://transferkit.io/一个在线云存储网盘,它提供了不限量的云存储空间,单文...【详细内容】
2021-12-17  Tags: 软件  点击:(15)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  Tags: 软件  点击:(19)  评论:(0)  加入收藏
给电脑安装软件,最让人担心的就是安装到“拖家带口”的,而这样的手法正是国产软件惯用的!全家桶自动安装、软文弹窗等等,这些让我们讨厌的却是软件的直接收入来源。 那么在你安...【详细内容】
2021-12-15  Tags: 软件  点击:(18)  评论:(0)  加入收藏
手机越用越卡,后台经常提醒内存不足,相信很多朋友都有这种体验,就是我们的手机用的时间久了,手机里装满了各式各样的应用软件。这其中就有许多不常用或者干脆没用的软件,这些应用...【详细内容】
2021-12-08  Tags: 软件  点击:(14)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条