CPU性能优化-基于源代码的CPU调优

一 在第二部分,我们将讨论如何使用CPU监控特性寻找CPU上运行的代码中可被调优的位置。对于性能敏感型应用程序,如大型分布式云服务,科学高性能计算软件,3A 级游戏等,了解底层硬件的工作原理是非常重要的。若在程序开发对没有关注硬件,那么从一开始就注定会失败。

标准的算法和数据结构在性能敏感型负载上并不总能表现得很好。传统链表的每个节点都是动态分配的,除了引入很多耗时的内存分配动作,很可能让链表中的所有元素分散在内存中,遍历该数据结构需要对每个元素进行随机内存访问。即使算法复杂度仍然是O(N), 但是实际上🎨耗时比简单数组还要多,有些数据结构比如二叉树,有着天然的类似链表的结构表示,所以使用指针追踪的方式实现他们可能性能更好。不过,这些数据结构还有更高效的扁平化版本,比如boost::flat_map和boost::flat_set。

即使你选择的算法在解决特定问题时最有名,但是在你的特定场景上它不一定表现最优。例如,二分搜索在排序数组中查找元素方面时最优的。然而,该算法经常会有很多分支预测错误的问题,因为每次元素值的检查都只有50%的概率为真。这就是为何线性搜索通常在小型整型数组上表现得更好。

性能工程时一门艺术,和其他艺术类似,可能的场景范围是没有边界的。本章尝试专注于与CPu微架构相关的优化,而不是覆盖所有你能想到的优化机会。尽管如此,我想还是有必要列出一些上层的优化点。

1 如果程序是使用解释语言开发的,那么可以使用开销更低的语言重写程序的性能关键部分。

2 分析程序中使用的算法和数据结构,看看是否可以找到更好的。

3 调优编译器参数,检查是否至少使用了这三个编译器标签:-O3 -march 启用针对待定CPU系列的优化功能和-flto 启用过程间优化功能。

4 如果问题是高度并行化的计算,那么把程序线程化或者考虑吧程序放在GPU上运行。

5 当等待IO操作时,使用同步IO以避免阻塞

6 利用更多RAM来减少必须使用的CPU和IO量

数据驱动的优化

数据驱动的优化是最重要的调优技术之一,它基于对程序正在处理的数据结构的洞察。该方法聚焦于数据的分布及其在程序中的转化方式,该方法的典型例子是数组结构体(structure-Of-array, SOA)到结构体数组。

这类优化需要知道程序会处理哪些数据和数据的分布情况,然后相应的修改程序。

现代CPU是非常复杂的设备,我们几乎不可能预测某段代码如何运行。CPU指令的执行依赖很多因素,变化的组件太多了,以至于人们不得不认真对待。幸运的是,借助第6章讨论过的性能监控功能,我们可以从CPU的角度观察代码。

注意,实现的优化不一定对所有的平台都有效果。例如,循环阻塞非常依赖系统内存的层次特征,尤其是L2和L3缓存的大小。因此,为具有特性L2和L3缓存大小的CPU调优的算法,在具有较小缓存的CPU上表现不一定好,在程序将要运行的平台上测试这些变化是非常重要的。

接下来的三章是按最便于使用TMA方法的方式组织的,这样分类的初衷是为工程师提供某种检查清单,以便他们高效的消除TMA揭露的低效问题。同样这里并不打算给出能到的转换。

相关推荐
小小工匠14 小时前
Redis - 如何使用 Redis 实现分布式锁
redis·性能优化·集群·并发
放下华子我只抽RuiKe517 小时前
FastAPI 全栈后端(三):数据库与 ORM
前端·数据库·react.js·oracle·性能优化·前端框架·fastapi
一个天蝎座 白勺 程序猿17 小时前
从300秒到3秒:我在KES上“干掉“标量子查询的性能优化实践
性能优化·量子计算·kingbasees·向量化执行
Jinkxs18 小时前
Rust 性能优化全流程:从 flamegraph 定位瓶颈到 unsafe 与 SIMD 加速,响应快 2 倍
开发语言·性能优化·rust
醉颜凉18 小时前
Elasticsearch性能优化:JVM GC调优全攻略,彻底解决集群卡顿、吞吐量下降问题
jvm·elasticsearch·性能优化
梵得儿SHI18 小时前
Vue 项目实战与性能优化全攻略:从代码、渲染到首屏,一站式解决卡顿慢加载
前端·vue.js·性能优化·vite·前端面试·前端优化·首屏优化
Swift社区20 小时前
鸿蒙游戏为什么掉帧?60FPS性能优化实战指南
游戏·性能优化·harmonyos
山峰哥1 天前
从全表扫描到覆盖索引:我是怎么干掉慢查询的
数据库·sql·oracle·性能优化·编辑器·深度优先
逻极1 天前
HTTP/HTTPS 协议从入门到精通:从原理到性能提升400%的完整路径(协议优化实战)
网络协议·http·性能优化·https·tls