SlideShare une entreprise Scribd logo
1  sur  21
Télécharger pour lire hors ligne
移动开发性能优化




                                   西安极客软件科技有限公司
                                           王凯强
                                   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

Contenu connexe

Similaire à 移动开发的性能优化

Struts Mitac(1)
Struts Mitac(1)Struts Mitac(1)
Struts Mitac(1)wangjiaz
 
基于Erlang的
基于Erlang的基于Erlang的
基于Erlang的hnoutman
 
110329 luopeng-sysopt-openkavass
110329 luopeng-sysopt-openkavass110329 luopeng-sysopt-openkavass
110329 luopeng-sysopt-openkavassZoom Quiet
 
openGauss DBMind.pdf
openGauss DBMind.pdfopenGauss DBMind.pdf
openGauss DBMind.pdfwot chin
 
新时代的分析型云数据库 Greenplum
新时代的分析型云数据库 Greenplum新时代的分析型云数据库 Greenplum
新时代的分析型云数据库 Greenplum锐 张
 
Virtual Datacenter
Virtual DatacenterVirtual Datacenter
Virtual DatacenterLRYANG
 
[嵌入式系統] 嵌入式系統進階
[嵌入式系統] 嵌入式系統進階[嵌入式系統] 嵌入式系統進階
[嵌入式系統] 嵌入式系統進階Simen Li
 
数据访问层开发实践
数据访问层开发实践数据访问层开发实践
数据访问层开发实践xcq
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发leneli
 
王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计YANGL *
 
Windows 8 apps dev.整理及分享
Windows 8 apps dev.整理及分享Windows 8 apps dev.整理及分享
Windows 8 apps dev.整理及分享Liyao Chen
 
實作 Linux Driver 移植在樹莓 Pi 上:Linux One wire sensor & I2C framebuffer Driver Po...
實作 Linux Driver 移植在樹莓 Pi 上:Linux  One wire sensor & I2C framebuffer Driver Po...實作 Linux Driver 移植在樹莓 Pi 上:Linux  One wire sensor & I2C framebuffer Driver Po...
實作 Linux Driver 移植在樹莓 Pi 上:Linux One wire sensor & I2C framebuffer Driver Po...IttrainingIttraining
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲ArBing Xie
 
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)悦 温
 
系統程式 -- 第 12 章
系統程式 -- 第 12 章系統程式 -- 第 12 章
系統程式 -- 第 12 章鍾誠 陳鍾誠
 
C1000K高性能服务器构建技术
C1000K高性能服务器构建技术C1000K高性能服务器构建技术
C1000K高性能服务器构建技术Feng Yu
 
Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計Wei-Yu Chen
 

Similaire à 移动开发的性能优化 (20)

Struts Mitac(1)
Struts Mitac(1)Struts Mitac(1)
Struts Mitac(1)
 
基于Erlang的
基于Erlang的基于Erlang的
基于Erlang的
 
110329 luopeng-sysopt-openkavass
110329 luopeng-sysopt-openkavass110329 luopeng-sysopt-openkavass
110329 luopeng-sysopt-openkavass
 
openGauss DBMind.pdf
openGauss DBMind.pdfopenGauss DBMind.pdf
openGauss DBMind.pdf
 
新时代的分析型云数据库 Greenplum
新时代的分析型云数据库 Greenplum新时代的分析型云数据库 Greenplum
新时代的分析型云数据库 Greenplum
 
Jobforcompal
JobforcompalJobforcompal
Jobforcompal
 
Virtual Datacenter
Virtual DatacenterVirtual Datacenter
Virtual Datacenter
 
[嵌入式系統] 嵌入式系統進階
[嵌入式系統] 嵌入式系統進階[嵌入式系統] 嵌入式系統進階
[嵌入式系統] 嵌入式系統進階
 
数据访问层开发实践
数据访问层开发实践数据访问层开发实践
数据访问层开发实践
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
 
王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计
 
Windows 8 apps dev.整理及分享
Windows 8 apps dev.整理及分享Windows 8 apps dev.整理及分享
Windows 8 apps dev.整理及分享
 
實作 Linux Driver 移植在樹莓 Pi 上:Linux One wire sensor & I2C framebuffer Driver Po...
實作 Linux Driver 移植在樹莓 Pi 上:Linux  One wire sensor & I2C framebuffer Driver Po...實作 Linux Driver 移植在樹莓 Pi 上:Linux  One wire sensor & I2C framebuffer Driver Po...
實作 Linux Driver 移植在樹莓 Pi 上:Linux One wire sensor & I2C framebuffer Driver Po...
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
 
Planet Lab
Planet LabPlanet Lab
Planet Lab
 
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
 
系統程式 -- 第 12 章
系統程式 -- 第 12 章系統程式 -- 第 12 章
系統程式 -- 第 12 章
 
LLVM introduction
LLVM introductionLLVM introduction
LLVM introduction
 
C1000K高性能服务器构建技术
C1000K高性能服务器构建技术C1000K高性能服务器构建技术
C1000K高性能服务器构建技术
 
Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計
 

Plus de foxgem

浅说Vertx
浅说Vertx浅说Vertx
浅说Vertxfoxgem
 
Our Choice:电子书的新交互方式探讨
Our Choice:电子书的新交互方式探讨Our Choice:电子书的新交互方式探讨
Our Choice:电子书的新交互方式探讨foxgem
 
持续交付 - 使用云计算和虚拟化技术
持续交付 - 使用云计算和虚拟化技术持续交付 - 使用云计算和虚拟化技术
持续交付 - 使用云计算和虚拟化技术foxgem
 
Grails:下一代Java Web开发框架
Grails:下一代Java Web开发框架Grails:下一代Java Web开发框架
Grails:下一代Java Web开发框架foxgem
 
Groovy for Java Programmer
Groovy for Java ProgrammerGroovy for Java Programmer
Groovy for Java Programmerfoxgem
 
OpenParty西安:DSL in Groovy
OpenParty西安:DSL in GroovyOpenParty西安:DSL in Groovy
OpenParty西安:DSL in Groovyfoxgem
 
OpenParty西安:What does DevOps mean?
OpenParty西安:What does DevOps mean?OpenParty西安:What does DevOps mean?
OpenParty西安:What does DevOps mean?foxgem
 
OpenParty西安:How to be a good copycat?
OpenParty西安:How to be a good copycat?OpenParty西安:How to be a good copycat?
OpenParty西安:How to be a good copycat?foxgem
 

Plus de foxgem (8)

浅说Vertx
浅说Vertx浅说Vertx
浅说Vertx
 
Our Choice:电子书的新交互方式探讨
Our Choice:电子书的新交互方式探讨Our Choice:电子书的新交互方式探讨
Our Choice:电子书的新交互方式探讨
 
持续交付 - 使用云计算和虚拟化技术
持续交付 - 使用云计算和虚拟化技术持续交付 - 使用云计算和虚拟化技术
持续交付 - 使用云计算和虚拟化技术
 
Grails:下一代Java Web开发框架
Grails:下一代Java Web开发框架Grails:下一代Java Web开发框架
Grails:下一代Java Web开发框架
 
Groovy for Java Programmer
Groovy for Java ProgrammerGroovy for Java Programmer
Groovy for Java Programmer
 
OpenParty西安:DSL in Groovy
OpenParty西安:DSL in GroovyOpenParty西安:DSL in Groovy
OpenParty西安:DSL in Groovy
 
OpenParty西安:What does DevOps mean?
OpenParty西安:What does DevOps mean?OpenParty西安:What does DevOps mean?
OpenParty西安:What does DevOps mean?
 
OpenParty西安:How to be a good copycat?
OpenParty西安:How to be a good copycat?OpenParty西安:How to be a good copycat?
OpenParty西安:How to be a good copycat?
 

移动开发的性能优化

  • 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