Android(程序)性能分析 Traceview
“Traceview是android平台配备的一个很好的性能分析工具。它可以通过图形界面的方式让我们了解我们要跟踪的程序的性能,并且能具体到method。”
Traceview图形界面如下:
图1. Traceview界面
显示不同线程的执行情况,线上有不同颜色部分是代表线程执行不同函数。右上角显示时间轴的时间总长,左上角显示当前选中时间点的性能数据。
注:在图形上点击鼠标拖拽就可以有放大效果,恢复原图只要双击最上面的时间轴横线即可。
纵轴显示程序执行到的不同函数。横轴显示对应函数的性能数据,包括这些字段:Incl Cpu Time %,Incl Cpu Time,Excl Cpu Time %,Excl Cpu Time,Incl Real Time %,Incl Real Time,Excl Real Time %,Excl Real Time,Calls+RecurCalls/Total,Cpu Time/Call,Real Time/Call。
大体上介绍一下以上字段含义:
Incl是Inclusive(包含的),表示该函数的调用包括所有子函数的调用。
Excl是Exclusive(独有的),表示该函数的调用仅包括基本操作,不包括子函数的调用。
Real Time,就是时钟计时的时间(时长)。
"Elapsed real time is always same or more than CPU time for computer program which use only one CPU for processing. If no wait is involved for I/O or other resources, elapsed real time and CPU time are very similar."
%,占有的百分比。
所以,字段“Incl Cpu Time %”就表示对应函数的Cpu Time在整个时间轴的函数调用中占的百分比。
上面内容介绍了Traceview工具,光有工具而没有分析数据,哪来的性能分析。所以这部分内容讲述抓取分析数据。
该部分说明如何抓取分析数据,即创建分析数据文件(Trace File)。其方法有三种:
该方法是最简便也最实用,没有之一。而且不需要去修改代码也不管程序是否有读写SDCard权限(如方法2)。具体操作如下:
a. Eclipse切换至DDMS页面,选中需要分析的程序(如xlwireless.wirelessadhocnetwork),点击右上角按钮“Start Method Profiling”,如下图:
b. 停止操作时点击同一按钮,则Eclipse会自动弹出中Traceview图形界面,直接显示了Trace(文件)的分析结果。
c. 若想保持分析数据(trace文件),只要操作Eclipse菜单File -> Save As ... 即可。
的确是实在太简洁的操作吧!
注意:该方法不支持Android 1.5设备,Android 2.1或更早版本需SDCard机器权限,而Android 2.2之后即使没有SDCard也行。(引用自官方说明)
- If you are using DDMS, Android 1.5 devices are not supported.
- If you are using DDMS, Android 2.1 and earlier devices must have an SD card present and your application must have permission to write to the SD card.
- If you are using DDMS, Android 2.2 and later devices do not need an SD card. The trace log files are streamed directly to your development machine.
MainActivity的OnCreate方法添加:
Debug.startMethodTracing("xl-adhoc-trace");
MainActivity的OnDestory方法添加:
Debug.stopMethodTracing();
或者,你也可以换成在MainActivity的OnStart与OnStop方法。有人出现这样情况:“但是在实际的测试时发现这种方式其实并不好用,因为通常情况下我们的activity的onDestroy()是由系统决定何时调用的,因此可能等了很长时间都不会得到这个trace文件。因此决定在onStop()中来调用Debug.stopMethodTracing()。这样当我们切换到其它activity或者点击home键的时候onStop()就会被调用,我们也就可以得到完整的trace file。”
使用该方式获取trace数据需注意:程序须有SD卡读写权限,当然还有代码权限。
程序运行结束后,会在SD卡下生成对应trace文件(如xl-adhoc-trace.tracing),使用adb pull命令拉取trace文件或其他可视化拷贝都可以。
命令如下:
adb shell am profile start
adb shell am profile stop
但该方法没有去做过尝试。
工具 + 数据 = 分析结果
通过已保存有的trace文件,用命令行启动Traceview分析程序性能。
2. CMD命令行:traceview ***.trace (注意:全路径的trace 文件,否则可能不行)。
3. 自动弹出traceview图形界面,通过这个图形界面就开始分析程序的性能。
结合图形,做简单的示例分析:
a. 日志版的自组网程序刚启动时间(2s左右)的性能结果:
从上图分析结果:打印日志的逻辑占了程序性能很大比例。
b. 非日志版分享文件时的性能结果:
从上图分析结果:可以优化的地方包括Wifi列表更新操作的refreshWifiScanResult,文件分享(发送方)的onRequestFileRange。
针对分享文件数据(上图的)详细分析一下,查找refreshWifiScanResult与onRequestFileRange函数在具体地方占用其性能比例在哪里?
见下图显示,用红圈标注出了性能的关键地方。
(完)