前言
伴随着互联网的快速发展,数据的规模及软件的复杂程度呈指数级增长,带来的硬件资源开销、能源消耗也越来越大 。为了控制硬件成本,也为了支持更大的并发量,软件性能的优化工作也越来越重要 。接下来,本文将从“充分了解 CPU”、“深入理解编译器”、“对你的代码负责”三个方面详细、全面介绍下软件性能优化的原理及相关方法 。文章最后给出总结:性能优化的时机、性能优化的注意事项及性能优化需要的工具有哪些 。
1 充分了解 CPU
系统的 CPU 理论知识太多、太复杂,包括 CPU 架构、运算单元、记忆单元、控制单元、数据总线、指令周期、多核、超线程等等,这里只讲三个性能优化时常见的概念:cache、寄存器和多线程 。
- cache
结构体变量字节对齐
预取(prefetch):提前获取下一阶段程序执行需要的数据
函数重排:获取程序运行轨迹,重排二进制目标文件(elf 文件)里的代码段
函数冷热分区
- 寄存器
- 多线程
2 深入理解编译器
避免过多的函数跳转,请使用内联函数和函数宏;
编译器自带的优化项,比如 gcc -O3 等;
32 位环境里面用 64 位 counter 很显然会影响性能,所以除非必要,最好别用;
使用静态内存替代堆内存,,可以做到提前分配;
利用编译器自带的优化工具,做好分支预测 。
3 对你的每一行代码负责
算法的重要性相必大家都很清楚了,每个人都能想到这一点,好的算法能带来性能数量级上提升 。这里,推荐一种最简单也是最有效的手段:查表,内存足够的话,数组性能最高 。
不要做额外的事情,特别是无用的事情,避免重复计算 。
内存池能大量减少内存碎片 。
理清多条件判断的顺序,尽量在最外层条件判断时就能有结果 。
除了上述三点之外,还有 I/O 优化、网络通信时间优化、硬件加速(使用专有硬件,将部分软件功能下沉到硬件)、优化代码流程等方法 。
总结:
- 性能优化的时机
- 性能优化的工具
- 性能优化的注意事项
要平衡好程序性能和代码美观度及可读性之间的关系 。
性能优化要按照软件重构的步骤:
一个时刻只戴一顶帽子;可观察行为保持;小步前进
最后,引用大神 Kent Beck 的一句话作为文章的结尾:“你可能不会成为一个伟大的程序员,但是你可以成为一个具有伟大习惯的好程序员 。”
文章插图
【充分榨干 CPU 的每一个 TICK:软件性能优化方法知多少】
推荐阅读
- Java线上CPU100% 问题排查
- 一条垃圾SQL,把 64 核 CPU 快跑崩了
- 你不好奇 CPU 是如何执行任务的?
- 一口气看完45个寄存器,CPU核心技术大揭秘
- CPU越来越热吗 一文带你看懂怎么选
- 2020年 你到底需要什么样的CPU来满足你的日常使用呢?
- CPU处理器|打造下一个ASML?荷兰投资77亿元研发硅光子芯片技术
- CPU针脚密密麻麻,几千根针脚坏了一两个竟然还能点亮?
- 因为没选对CPU,小万元的3080废了!论电脑CPU如何选购
- i3,i5,i7的cpu到底有什么区别?