1. 优化方向
1.1 减少数据拷贝
1.1.1 尽量减少数据拷贝次数,采用指针而非实际数据传参
1.1.2 内核与用户态间数据拷贝注意使用cache,与不带cache的性能可相差10倍(具体参见内存山图)
i.e. 鱼眼特性拷贝用户态5400kb的YUV只需6ms,从海思解码帧存(内核态分配地址)拷贝需30ms,采用带cache的帧存后与用户态拷贝耗时一致
1.2 cache命中优化
1.2.1 空间局部性: cache采用cache line传输,将相邻数据放在一起可提升cache命中;减少全局变量与静态变量的使用(一般与代码相距较远);使用section宏让相关代码在内存里紧密排列
1.2.2 时间局部性: 同一段数据采用函数回调方式层层处理(类似linux网络协议栈处理)以提升cache命中率,相反如果两个线程一个线程处理完通知另一线程处理,等另一线程调度时cache可能已经发生变化
1.3 锁优化
1.3.1 减少锁的使用
1.3.2 根据场景不同使用不同的锁(自旋锁,读写锁,顺序锁...)
1.3.3 实现无锁代码(CAS...)
1.4 减少调度
1.4.1 设置CPU亲和性
2. 性能调试工具
2.1 perf
2.1.1 编译perf
perf为linux自带工具,在内核目录/tools/perf下直接make即可,可能会出现以下两个问题
gcc threat warning as error: 交叉编译perf需执行参数,具体参见Makefile首部注释说明很清楚 i.e. make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- WERROR=0
can't find liblk.a: 注意编译perf依赖liblk.a,如果是交叉编译的perf需先删除默认路径下liblk.a(基于x86的库)并交叉编译生成对应的库
2.1.2 使用perf查看热点函数
perf top -G > result.txt
转载于:https://www.cnblogs.com/Five100Miles/p/9235752.html