软件性能优化是一个很大的概念。首先从自带的一些工具开始,利用工具来协助我们对性能做优化。
解决系统性能问题的几个主要步骤是:找->定->调
找:要优化肯定要先找下那部分有性能问题啊,例如有用户投诉所APP卡,你和他沟通后,他说了在主界面滑动过程卡顿。这样我们就大致找到一个需要优化的范围点,接下来需要定位啊。当然这是游击,碎片化的方式,最好还是对程序进行大量的有针对性的测试,得到测试数据,然后根据需要定调整目标,要求达到一个怎样的优化效果,例如启动时间由2310ms编程1320ms等等。
定:找到了问题的大致方向,需要更具体的分析系统瓶颈,分析测试数据,找到其中的bottleneck。
调:找到瓶颈所在,当然需要对bottleneck的代码做优化。
关于瓶颈,一般而言主要就这样三类:
低频高耗:函数被调用次数不多,但每次调用却花费很长时间。
高频低耗:指那些函数自身占用时间不长,但调用却非常频繁的函数。
高频高耗:那被调用频繁,且函数本身耗费长的,这绝对重点关注对象啊。
怎么去找到这些瓶颈,可以使用TraceView来实现
TraceView介绍
现在就需要来介绍下这个界面的内容了
整个界面主要分两个大块,顶部由A和C构成的时间线面板(Timeline Panel)和下面的分析面板(Profile Panel)。
Tips:双击上面的函数信息那一栏可以缩小,鼠标选中线程的颜色部分轻微水平拉动可以放大图颜色脉冲bar的高度表示cpu的利用率,高度越高表示cpu利用率越高白色gap空白块表示该线程目前没有占CPU,被其他线程占用黑块表示系统空闲(system idle)
下面的模板信息就很多啦。我们看下顶栏,现在对主要的各个属性的意思如下面表格
列名
描述
Name
该线程运行过程中所调用的函数名
Incl Cpu Time
某函数占用的CPU时间,包含内部调用其它函数的CPU时间
Excl Cpu Time
某函数占用的CPU时间,但不含内部调用其它函数所占用的CPU时间
Incl Real Time
某函数运行的真实时间(以毫秒为单位),内含调用其它函数所占用的真实时间
Excl Real Time
某函数运行的真实时间(以毫秒为单位),不含调用其它函数所占用的真实时间
Call+Recur Calls/Total
某函数被调用次数以及递归调用占总调用次数的百分比
Cpu Time/Call
某函数调用CPU时间与调用次数的比。相当于该函数平均执行时间
Real Time/Call
同CPU Time/Call类似,只不过统计单位换成了真实时间
Incl Cpu Time %
表示以时间百分比来统计的Incl Cpu Time
次数 ,我们看到,我们的simplyFunc被用了666次,很正确。很好,这样看下他的上面几个667次的,我们的SimplyFunc内容为拼接字符串然后打印日志,所以与String相关的几个函数也被调用了很多次。
private void simplyFunc() { String a = "hello "; String b = "world"; Log.e(TAG, "simplyFunc() print= " + a + b);}
直觉告诉我们,编译器有可能把第三行代码用一个StringBuilder来处理了。
时间,我们是确定这个函数确实调用次数多很高频,但这不代表人家耗时,所以我们看下右边的关于霸占的CPU时间,我们看到他的Incl Cpu Time为37.183,占了总数的75.9%。很好,这样我们就确认这个函数是一个瓶颈,是我们需要花时间来处理的。
到这里基本我们确定了,完成了找的步骤。现在需要完成的是定的步骤,确定下瓶颈实际在哪里。我们再看下图,在我们的函数展开的下面,有些内容,我们需要看下。
Parents : 这个表示调用这个函数的父方法,就是指是onRepeatClick
调用了这个函数。
Children:相对于Parents,这个就是他调用的。