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 小时前
API 网关真流式改造实战:长文翻译首字延迟从 15 秒级降到亚秒级
性能优化·sse·api网关·deepseek·流式输出
晏宁科技YaningAI18 小时前
企业通信系统技术规划方法:从业务需求到可演进架构
网络·性能优化·架构·gateway·paas
天空之城--21 小时前
过去一周Android行业动态:编码技术与综合趋势精选
android·flutter·性能优化·kotlin·android jetpack
爱喝水的鱼丶1 天前
SAP-ABAP:SAP学习分享:深入理解事务码ME32K——更改采购合同
性能优化·sap·abap·业务学习·开发交流·交流学习·采购合同
爱喝水的鱼丶1 天前
SAP-ABAP:ABAP 用户出口开发规范与避坑指南:10 类典型错误与运维方案
运维·性能优化·sap·abap·增强·经验交流·出口
爱喝水的鱼丶1 天前
SAP-ABAP:BAdI 上下文数据获取与交互:标准数据读取与修改逻辑实现
运维·性能优化·sap·abap·增强·经验交流·badi
迪飞特科技2 天前
《MyBatis 批量插入性能优化的 5 个关键参数配置》
android·性能优化·mybatis
寻求出路的程序媛2 天前
分布式 & 高性能 & 高可用 体系、学习重点、面试点
分布式·后端·面试·性能优化
JMchen1232 天前
【Android 性能优化实战 60 讲】04 Memory Profiler 高阶玩法:深剖堆内存原理,实战定位 Kotlin 闭包隐式泄漏
android·性能优化·kotlin·实战·源码分析·内存泄漏·memory profiler