热点函数涉及到大量IO读写操作时,数据的内存地址尽量与NEON数组或系统位数对齐,如32位对齐,可降低访问开销
跑demo得到profile,看开销占比Top5,必须对其优化一版
重点优先搞NEON指令并行计算,能大幅降低开销
for循环
cf[b]
, 今读取:cf[b - 3]
数组索引取值
内存使用
指令运算
算法角度
细节
-4, +=4
组合问题,会导致结尾处哪怕有4个值也只能单独计算。-3,+=4
;其他类似:-7, +=8
;不管是<=、<或>=场景。for (i = 0; i < size; i++)
for (i = 0; i < size - 3; i += 4)
for (; i < size; i ++)
#ifndef XX_NO_NEON
宏开关来控制NEON开关,便于回退NEON优化版本来debug初始编译选项:O0,Omemory(优化内存),开内联
优化编译选项:O2,Otime(优化时间),不开内联;一般开O2
建议基线优化时,尽量选不开内联以改善视图
,以便观察热点函数中实际大头开销所在
尽量能用O3优化就用O3,不能的部分代码单独用O2优化编译,然后链接该模块,再整体一起O3编译
不要轻易restore default编译设置,否则会导致所有配置失效,如编译平台、编译选项
开销计算
用#ifndef XX_NO_NEON
来定义有关NEON的宏,用意何在,为啥不用#ifdef XX_NEON
?
#ifndef ALG_NO_NEON
// opt_neon_code
...
#else
// origin code
...
#endif
#ifdef XX_NEON
也无不可,不影响效果。附学习过程中用到的好资源,最后一个参考链接是彩蛋,涉及:Optimizing Software in C++ - Agner Fog - PDF,C++软件性能优化。
这本书是所有C++程序员都应该要读的一本书,它事无巨细地从语言层面、编译器层面、内存访问层面、多线程层面、CPU层面讲述了如何对软件性能调优,是一本经典的电子书,欢迎进阶阅读!
资料链接汇总: