为了确定代码和功能是否需要优化,优化后是否有提升,针对性能进行度量是非常必要的。
大多情况,性能使用函数完成某个操作所花费的的时间作为测量依据。比如,游戏的性能一般用每秒渲染多少帧进行度量,这个直接
由渲染帧所需要的时间决定,比如某个游戏要保持60帧/秒的恒定速率,那么每帧渲染和显示的时间应该要小于16.67毫秒(注:小于100毫秒的响应时间才会让人有瞬时的感觉)
一、时间测量
Java和Android提供了以下API,可以用来测量时间和性能:
System.currentTimeMillis(Java)(不建议使用,精度和准确度不够,且更改系统时间会影响结果)
System.nanoTime(Java)(建议使用,提供了更好的精度和准确度)
Debug.threadCpuTimeNanos(Android)
SystemClock.currentThreadTimeMillis(Android)
SystemClock.elapsedRealTime(Android)
SystemClock.uptimeMillis(Android)
要测量时间,需调用两次计算时间差来度量性能。
二、方法调用跟踪
一旦确定在哪儿花费了过多时间,就需要了解更多细节,找出罪魁祸首的方法。这时可以利用跟踪工具创建方法跟踪文件,之后用Traceview工具进行分析。
2.1 Debug.startMethodTracing()
该方法有四个变种:
Debug.startMethodTracing()
Debug.startMethodTracing(String traceName)
Debug.startMethodTracing(String traceName,int bufferSize)
Debug.startMethodTracing(String traceName,int bufferSize, int flags)
Android提供了Debug.startMethodTracing()方法来创建跟踪文件,然后用Traceview工具调试和分析应用。该文件默认会创建在sdcard目录下,文件默认最大
大小是8MB
代码示例:
Debug.startMethodTracing(“/sdcard/test.trace”);
/ /需要跟踪的操作
Debug.stopMethodTracing();
2.2 使用Traceview工具
Android SDK tolls下有一个Traceview的工具,它可以分析这些跟踪文件并给出图形化的结果展示。你只需要在命令行下输入 traceview awesometrace.trace 就可以
启动Traceview。
Traceview的信息包含了所有的函数调用,以及调用执行的时间和调用次数
表中有以下7列内容:
Name:方法名
Inc %:此方法所占的时间百分比(包含子方法)
Inclusive:此方法所花毫秒数(包含子方法)
Excl %:此方法所占时间百分比(不包含子方法)
Exclusive :此方法所花毫秒数(不包含子方法)
Calls+RecurCalls/Total:调用和递归调用次数
Time/Call:平均每次调用时间
(注:启用跟踪时,Dalvik的JIT编译器是禁用的,得到的结果可能会有一定误导性,因为方法可以被Dalvik的JIT编译器编译为机器码,所以在真实场景下执行需要花费的时间会更少。此外,跟踪不会显示本地函数耗费的时间。下一章节会补充本地方法跟踪)