狠狠撸

狠狠撸Share a Scribd company logo
移动开发性能优化




                                   西安极客软件科技有限公司
                                           王凯强
                                   Guaiss.Wang@gmail.com


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快得多                                $ layoutopt samples/
                                                 samples/compound.xml
? UI与逻辑的分离是很重要的
                                                    7:23 The root-level
                                                 <FrameLayout/> can be replaced
                                                 with <merge/>
                                                    11:21 This LinearLayout layout or
? Layoutopt                                      its FrameLayout parent is useless
? Layoutopt <list of xml files or directories>   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!
? Hierarchy Viewer 层级观察器                            20:81 This LinearLayout layout or
       ? 显示控件的节点的测量(measure)、                    its LinearLayout parent is useless
       布局(layout)以及画视图(draw)的时间                     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
谢谢!




Confidential All rights reserved

More Related Content

移动开发的性能优化

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