Systrace 无疑是性能优化神器,如果能辅以函数插桩,则能发挥它的最大威力,让所有的性能问题都无处遁形,比如常见的锁竞争、io等待和线程竞争等等问题。此文先只介绍Systrace的基本用法。
使用Systrace有两种方式,一种是使用python命令运行,另一种是通过DDMS运行,自行选择就行。
收集信息
- 首先,用来调试的App工程需要在清单文件里将Application的debuggable开关打开。
- 在要观察的代码前后加上Trace的头尾函数,编译并安装到手机。
-
打开DDMS,进入Systrace工具,选择调试进程,以及记录时长。按下确定之后,操作手机,便可以记录这段时间的运行情况。
- 用Chrome浏览器打开生成的html文件。找到Trace头函数带上的信息,并分析。
分析数据
以下给出三种不同类型的分析过程,作为示例。
-
计算密集型任务
我们一般知道,图片和视频之类处理、简单内存操作,差不多都归属于计算密集型任务,比较占用CPU,需要控制并行的线程数量,避免CPU进行频繁的线程切换,这种类型的任务就需要放进计算密集型的线程池中。
如图所示,这个选中的函数是在处理图片,整个函数总耗时(Wall Duration)58ms,CPU工作(CPU Duration)了44ms。 -
IO 密集型任务
常见的IO操作就是读写文件、网络请求,这种类型的任务大量时间在等待系统调用的返回和硬件的数据处理,基本不占CPU,可以提交并行的线程数量,发挥CPU的最大效率,这种类型的任务就需要放进IO密集型的线程池中。
如图所示,这个选中的函数是在进行网络请求,整个函数总耗时(Wall Duration)138ms,CPU工作(CPU Duration)了8ms。 -
锁竞争
由synchronized关键字产生的锁竞争会明显地显示出来。
如图所示,这个选中的函数需要的锁被线程Id为16283的线程占用长达1647ms之久,就需要好好优化了。
小结
如果嫌Trace添加起来太累,可以考虑函数插桩。
愿大家玩得开心。