采用热点函数功能分析

进入系统性能分析,采用热点函数分析,确定哪些热点函数存在性能瓶颈。

IDR指令比例高

开启CPU Prefetching。

CPU将内存中的数据读到CPU的高速缓存Cache时,除了读取本次要访问的数据,还会预取本次数据的周边数据到Cache里面,如果预取的数据是下次要访问的数据,那么性能会提升;如果预取的数据不是下次要取的数据,那么会浪费内存带宽。

对于数据比较集中的场景,预取的命中率高,适合打开CPU预取;若数据不集中,预取命中率低,则浪费内存带宽。

内联函数

频繁调用的小函数优化成内联函数,内联函数是典型的空间换时间的优化方法。

请参见:https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0085.html

NEON指令加速

采用NEON指令向量化优化。

请参见:https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0053.html

循环优化

循环优化是对程序中使用到的循环部分进行代码优化,合理的优化可以充分利用处理器的计算单元,提升指令流水线的调度效率,也可以提升Cache命中率。循环的方法有很多,如循环展开、循环融合、循环分离、循环交换和循环平铺。

请参见:https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0083.html

分支优化

Cache优化

结构体优化

减少不必要的Barrier

现代CPU为了提升流水线的执行效率,一般都实现了乱序执行的功能,意味着代码的指令顺序与指令实际执行顺序可能不一样,特别是没有寄存器依赖的两条指令,执行顺序无法确定。但有些场景下,希望这两条指令是保序的,比如往某个内存地址写入一个值后,需要等到写入完成后(写入内存是需要时间的),再往某个外设寄存器中写入数据,因为这个寄存器地址与内存地址没有数据依赖,CPU无法保证执行顺序,所以提供了Barrier指令供程序员手动进行保序。

图7 手动保序

ARMv8提供3条Barrier指令:DMB、DSB、ISB

DMB:数据存储器隔离。

DSB:数据同步隔离。

ISB:指令同步隔离,比DMB严格。

DMB、DSB、ISB执行代价依次递增,从性能角度考虑,能不用Barrier的地方尽量不用,能用DMB的,不要用DSB/ISB。另外,需要注意ARMv8增加了Load acquire/Store release指令,隐含了Barrier操作,具体参见章节。

访存优化

多核优化