perf工具
1、查找耗时点、cache-misses、L1-dcache-load-misses
perf top -C x
perf record -g -e cpu-clock -F 99 -p xxx
perf report --- 函数、汇编
最近参与了acl性能优化的方面的工作,目前优化过程接近尾声,过程中走了不少弯路,当然也学习到了很多性能优化的方法,现在做下总结。
优化角度:架构、算法、代码。软件&硬件。
这里不讨论硬件优化,以及架构优化,因为这个都是系统级别的,不是可以轻易优化的。
了解业务 ------- 优化算法 或 设计新算法 ---------- 优化代码
首先要对业务有非常通透的理解,因为大多数代码首次开发或者架构设计的时候受项目进度约束,并非最完美的,了解了业务,同时明确目前的代码实现,这样就可以找出当前的代码存在冗余的部分,可以除去不必要的处理,或者合并部分处理过程。甚至设计新的算法。算法确认最优后,其次才能对代码细节做优化。
算法优化:线性表-----链表------哈希-----树
栈、队列:这两个一般是功能型的结构,不涉及性能。
线性表:定义的数组、开辟的连续内存
链表:指针、向量
哈希:bihash
树:二叉树、
平衡二叉树:搜索性能好
红黑树: 插入删除动态调整的性能好
以上适用于数据较小,完全可以放在内存中。
=================================================
B树:多叉树
B+tree:数据都在叶子结点,平衡查找速度
B*tree:可指向兄弟节点,减少分裂。
以上适用于数据库等数据量较大,需要放在磁盘上。
=================================================
tire树:
radix树:
=================================================
代码优化方法:
内存角度:大页表(TLB、大页内存):访问内存,要查页表,加速查表。
缓存角度:cache优化(i-cache、d-cache、对齐)、数据预取(连续内存、适度预取)
耦合角度:高内聚低耦合(相关代码放在一起)、减少冗余代码
开栈角度:减少调用层次 、inline、宏构造函数、
指令角度:循环展开(指令预取相关)、分支预测(likely)
其他:寄存器参数、延迟计算、提前计算
拓展:多核、多线程、共享数据、读写分离、异步、并发、上下文切换、内存池、
问:为了减少函数调用层次,减少开栈时间,而把一个函数写的较大,