关于嵌入式(移动)软件的性能问题
2010-09-16 00:00:00 来源:WEB开发网花费时间比重很高的函数。
包含全部子函数花费比重很高的函数。
调用次数非常高的函数。
文件IO
关注IO的频度和通量。复杂的性能问题通常看不出IO明显的异常,但是要结合设计约束来分析,就能找到一些线索。比如一次路径计算他的搜索空间会达到2,3万,我们由此可以计算出理论上的io访问量,如果发现实际数值有异常,就可以推断出Cache抖动或其他问题。
内存访问
内存操作也是制约性能的一个关键因素,观察哪些调用非常频繁的函数,比如上文的路径算法GetNodeByID,调用30万次,每个Node结构体1.5k,总共copy量达到450M。这显然会成为性能问题,所以在新结构中,设计了精简紧凑的Node结构和平板Cache(直接访问而不需要Copy),大幅降低了内存Copy。
内存分配/释放/碎片通常也是性能问题的一个重要因素,我们的架构采用了小内存优化,因此这个问题还不突出,也还有很多开源的方案,如GooglePerfTools,dlmalloc,wtf等。
Cache命中
Cache通常位于系统不同层的边界上,Cache的性能对系统影响很大
获取Cache的一些工作状态指标,如命中率,回收效率。
架构级别的性能问题单独的分析某一个数据通常很难下结论,需要同一个时间点不同架构层的性能数据,也需要不同时间的性能数据曲线。
尝试一下系统在不同条件下表现出来的性能数据流,甚至是边界情况,实际的工况跑不出来,就写测试程序压出来。
Cache为0和Cache为无穷大,系统性能曲线会怎么变化?
分析Cache在极限情况下系统的整体性能很有帮助,可以由此推断出Cache上下的两个系统层面的性能开销比例。
模拟一个慢3倍的IO读写,系统性能曲线会怎么变化?
不同的数据类输入,系统性能曲线会怎么变化?
对于那些需要经常性分析性能故障的系统,最好设计一个log系统,会大幅提高工作效率,log系统异步的把各个部分的指标数据收集起来,可通过PC端的工具图表化。
性能Tips
整体性能的改进和优化的一般性方法。
数据结构/组织:嵌入式设备上的CPU,总线,IO速率都远不及PC,所以对于在嵌入式设备上做大数据量处理(如路径计算,AI,图形)时,降低数据处理的计算总量就很重要。
快速的压缩方法。
精简的数据结构设计。(减少那些需要大规模访问的结构的尺寸)
更多精彩
赞助商链接