移动开发的性能优化
DESCRIPTION
TRANSCRIPT
Confidential All rights reserved
对安卓平台分析
一些性能优化的手段
简介性能优化的工具
内容
Confidential All rights reserved
快速
流畅
省电
用户体验导向
Confidential All rights reserved
Android开发的难点
硬件不同
ROM不同
Confidential All rights reserved
NDK?
通用性 - ARM平台 Intel平台
可以使用某些C++库 如UDT
与Native method有链接时间,并不一定提速
注意释放
Confidential All rights reserved
代码习惯
注重代码复用
做好应用分析
多使用第三方工具
不做没有必要的工作
尽量避免内存分配
Confidential All rights reserved
一些性能优化的方法
即时编译技术 Android2.2+
有无JIT的设备间也存在着巨大差异,在JIT设备上好的代码有时候会在无JIT的设备上表现的并不好。
如果你想知道一个程序在设备上的具体表现,就必须在上面进行测试。
在没有JIT的设备上,调用方法所传递的对象采用具体的类型而非接口类型会更高效(比如,传递HashMap map比Map map调用一个方法的开销小,尽管两个map都是HashMap).事实上,他们只相差6%,而有JIT时这两种调用的效率不相上下。
在没有JIT的设备上,缓存后的字段访问比直接访问快大概20%。而在有JIT的情况下,字段访问的代价等同于局部访问,因此这里不值得优化,除非你觉得他会让你的代码更易读(对于final ,static,及static final 变量同样适用)
Confidential All rights reserved
一些性能优化的方法
避免创建不必要的对象
当从输入的数据集合中读取数据时,考虑返回原始数据的子串,而非新建一个拷贝
将多维数组切割成平行一维数组
...
用静态代替虚拟
调用会加速15%到20%
避免内部Getters/Setters
与C++的习惯不同 虚方法调用的代价比直接字段访问高昂许多
使用Static Final修饰常量
合理利用浮点数
比整型慢两倍
了解并使用类库 com.google.common
使用For each
用于实现了iterable接口的集合类及数组中
Confidential All rights reserved
一些性能优化的方法
zero()是当中最慢的,因为对于这个遍历中的历次迭代,JIT并不能优化获取数组长度的开销。
One()稍快,将所有东西都放进局部变量中,避免了查找。但仅只有声明数组长度对性能改善有益。
Two()是在无JIT的设备上运行最快的,对于有JIT的设备则和one()不分上下。他采用了JDK1.5中的改进for循环语法。
Confidential All rights reserved
一些性能优化的方法
不要过多的指望gc,不用的对象可以显式的设置为空
gc的原理
不要在循环中创建过多的本地变量。
Confidential All rights reserved
高性能IO
MemoryFile
类似win32平台的MapViewOfFile() Linux平台的mmap()
应用于I/O频繁操作 如 加密解密
Confidential All rights reserved
布局XML优化
Java处理效率比XML快得多
UI与逻辑的分离是很重要的
Layoutopt
Layoutopt <list of xml files or directories>
Hierarchy Viewer 层级观察器
显示控件的节点的测量(measure)、
布局(layout)以及画视图(draw)的时间
$ layoutopt samples/
samples/compound.xml
7:23 The root-level <FrameLayout/> can be replaced with <merge/>
11:21 This LinearLayout layout or its FrameLayout parent is useless
samples/simple.xml提示未使用到该布局
7:7 The root-level <FrameLayout/> can be replaced with <merge/>
samples/too_deep.xml
-1:-1 This layout has too many nested layouts: 13 levels, it should have <= 10!
20:81 This LinearLayout layout or its LinearLayout parent is useless
24:79 This LinearLayout layout or its LinearLayout parent is useless
Confidential All rights reserved
插件思想
单独的APK
大小、权限大幅减少
不要要兼顾原App的数据结构
通过 intent 传递数据
Confidential All rights reserved
文件大师的插件产品
插件系统
缓存清理
内存管理
文件加密
文字加密
号码百事通
... ...
Confidential All rights reserved
测试Android软件性能主要方法
在模拟器上的Dev Tools可以激活屏幕显示当前的FPS,CPU使用率,可以帮助我们测试一些3D图形界面的性能。
一般涉及到网络应用的程序,在效率上和网速有很多关系,这里需要多次的调试才能实际了解。
对于逻辑算法的效率执行,最普遍的,计算执行时间来查看
GC效率跟踪,如果你执行的应用比较简单,可以在DDMS中查看下Logcat的VM释放内存情况,大概模拟下那些地方可以缓存数据或改进算法的。
线程的使用和同步,Android平台上给我们提供了丰富的多仸务同步方法,对于线程和堆内存的查看这些都可以在DDMS中看到。
Confidential All rights reserved
TraceView
Debug.startMethodTracing("test");
Debug.stopMethodTracing();
/mnt/sdcard 生成test.trace
traceview E:\test.trace
Confidential All rights reserved
我的测试
Confidential All rights reserved
分析
Confidential All rights reserved
Exclusive: 同级函数本身运行的时间
Inclusive 就是说除统计函数本身运行的时间外再加上调用子函数所运行的时间。
Name:列出的是所有的调用项,前面的数字是编号,展开可以看到有的有Parent
和Children子项,就是指被调用和调用。
Incl: inclusive时间占总时间的白分比
Excl: 执行占总时间的白分比。
Calls+Recur Calls/Total: 调用和重复调用的次数
Time/Call: 总的时间。(ms)
根据Taceview的数据作出更改后,
请确保代码在没有Traceview时,确实跑的快了!
Confidential All rights reserved
其他
分析内存使用情况的工具
Allocation Tracker
Heap Dumps
...
Confidential All rights reserved
谢谢!