您的位置:首页 > 移动开发 > Android开发

android性能优化(1)—性能评测剖析

2013-01-13 17:52 218 查看
一、时间测量

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中一些性能评估的方法和工具
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: