一、时间测量
1.java和android提供了以下API来测量时间及性能
System.currentTimeMills
System.nanoTime
Debug.threadCpuTimeNanos
SystemClock.currentThreadTimeMills
SystemClock.elapsedRealTime
SystemClock.upTimeMills
2.测量
为何不使用System.currentTimeMills
a.其精度不够
b.更改系统时间会影响结果
3.System.nanoTime()
运行结果
4.Debug.threadCpuTimeNanos
该方法为android sdk自带,只会测量在当前线程中所花费的时间,如果要在多线程上进行测量,则必须在所有涉及线程的地方调用此方法并把结果加上
运行结果:
可以看到虽说暂停了1s,使其他线程获得调度机会,但是由于Debug.threadCpuTimeNanos只计算当前线程的运行时间,所以结果小于1s
如果我们现在在System.nanoTime的代码中改为如下所示:
运行结果:
可一看到时间大于1s,也就是说System.nanoTime会测量所有线程的运行时间
二、方法调用跟踪
1.Debug.startMethodTracing
上图是android中关于此方法的四个变种
2.demo
a.Debug.startMethodTracing(sdcardPath + "/shadow.trace");会在sdcard目录下生成一个trace文件
b.接着把该文件pull到桌面上
3.使用traceview文件
a.在命令行中输入如下命令
这时将会显示出如下图形界面
下面介绍以下几个选项:
Name:方法名
Incl%:此方法中占的时间百分比(包含子方法)
Inclusive:此方法所花费毫秒数
Excl%:此方法所占百分比(不包含子方法)
Exclusive:此方法所花费毫秒数(不包含子方法)
Calls+RecurCalls/Total:调用和递归调用次数
Time/Call:平均每次调用时间
下面我们来看看测试的方法结果:
可一看到Thread.sleep方法调用了3次,耗时3037.642ms,Thread.sleep又调用了TimeUnit.seconds.toMills和TimeUnit.seconds.excessNano,分别花费0.249和0.071ms,而我们的测试方法则共花费了3038.315ms
Parents:测试方法的调用者
Children:测试方法的调用方法
b.在DDMS中使用traceview
打开ddms视图,连续点击图中红框处两次(第一次表示start,第二次表示stop)
这是会在Eclipse中出现如下traceview视图
使用方法和命令行差不多
三、使用日志调试
android提供了以下日志级别
优先级:
Debug>Info>Warning>Error>Assert
好了,这就是今天要讲的在android中一些性能评估的方法和工具