移动开发的性能优化

21
Confidential All rights reserved 移动开发性能优化 西安极客软件科技有限公司 王凯强 [email protected]

Upload: foxgem

Post on 06-Dec-2014

1.616 views

Category:

Documents


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: 移动开发的性能优化

Confidential All rights reserved

移动开发性能优化

西安极客软件科技有限公司

王凯强

[email protected]

Page 2: 移动开发的性能优化

Confidential All rights reserved

对安卓平台分析

一些性能优化的手段

简介性能优化的工具

内容

Page 3: 移动开发的性能优化

Confidential All rights reserved

快速

流畅

省电

用户体验导向

Page 4: 移动开发的性能优化

Confidential All rights reserved

Android开发的难点

硬件不同

ROM不同

Page 5: 移动开发的性能优化

Confidential All rights reserved

NDK?

通用性 - ARM平台 Intel平台

可以使用某些C++库 如UDT

与Native method有链接时间,并不一定提速

注意释放

Page 6: 移动开发的性能优化

Confidential All rights reserved

代码习惯

注重代码复用

做好应用分析

多使用第三方工具

不做没有必要的工作

尽量避免内存分配

Page 7: 移动开发的性能优化

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 变量同样适用)

Page 8: 移动开发的性能优化

Confidential All rights reserved

一些性能优化的方法

避免创建不必要的对象

当从输入的数据集合中读取数据时,考虑返回原始数据的子串,而非新建一个拷贝

将多维数组切割成平行一维数组

...

用静态代替虚拟

调用会加速15%到20%

避免内部Getters/Setters

与C++的习惯不同 虚方法调用的代价比直接字段访问高昂许多

使用Static Final修饰常量

合理利用浮点数

比整型慢两倍

了解并使用类库 com.google.common

使用For each

用于实现了iterable接口的集合类及数组中

Page 9: 移动开发的性能优化

Confidential All rights reserved

一些性能优化的方法

zero()是当中最慢的,因为对于这个遍历中的历次迭代,JIT并不能优化获取数组长度的开销。

One()稍快,将所有东西都放进局部变量中,避免了查找。但仅只有声明数组长度对性能改善有益。

Two()是在无JIT的设备上运行最快的,对于有JIT的设备则和one()不分上下。他采用了JDK1.5中的改进for循环语法。

Page 10: 移动开发的性能优化

Confidential All rights reserved

一些性能优化的方法

不要过多的指望gc,不用的对象可以显式的设置为空

gc的原理

不要在循环中创建过多的本地变量。

Page 11: 移动开发的性能优化

Confidential All rights reserved

高性能IO

MemoryFile

类似win32平台的MapViewOfFile() Linux平台的mmap()

应用于I/O频繁操作 如 加密解密

Page 12: 移动开发的性能优化

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

Page 13: 移动开发的性能优化

Confidential All rights reserved

插件思想

单独的APK

大小、权限大幅减少

不要要兼顾原App的数据结构

通过 intent 传递数据

Page 14: 移动开发的性能优化

Confidential All rights reserved

文件大师的插件产品

插件系统

缓存清理

内存管理

文件加密

文字加密

号码百事通

... ...

Page 15: 移动开发的性能优化

Confidential All rights reserved

测试Android软件性能主要方法

在模拟器上的Dev Tools可以激活屏幕显示当前的FPS,CPU使用率,可以帮助我们测试一些3D图形界面的性能。

一般涉及到网络应用的程序,在效率上和网速有很多关系,这里需要多次的调试才能实际了解。

对于逻辑算法的效率执行,最普遍的,计算执行时间来查看

GC效率跟踪,如果你执行的应用比较简单,可以在DDMS中查看下Logcat的VM释放内存情况,大概模拟下那些地方可以缓存数据或改进算法的。

线程的使用和同步,Android平台上给我们提供了丰富的多仸务同步方法,对于线程和堆内存的查看这些都可以在DDMS中看到。

Page 16: 移动开发的性能优化

Confidential All rights reserved

TraceView

Debug.startMethodTracing("test");

Debug.stopMethodTracing();

/mnt/sdcard 生成test.trace

traceview E:\test.trace

Page 17: 移动开发的性能优化

Confidential All rights reserved

我的测试

Page 18: 移动开发的性能优化

Confidential All rights reserved

分析

Page 19: 移动开发的性能优化

Confidential All rights reserved

Exclusive: 同级函数本身运行的时间

Inclusive 就是说除统计函数本身运行的时间外再加上调用子函数所运行的时间。

Name:列出的是所有的调用项,前面的数字是编号,展开可以看到有的有Parent

和Children子项,就是指被调用和调用。

Incl: inclusive时间占总时间的白分比

Excl: 执行占总时间的白分比。

Calls+Recur Calls/Total: 调用和重复调用的次数

Time/Call: 总的时间。(ms)

根据Taceview的数据作出更改后,

请确保代码在没有Traceview时,确实跑的快了!

Page 20: 移动开发的性能优化

Confidential All rights reserved

其他

分析内存使用情况的工具

Allocation Tracker

Heap Dumps

...

Page 21: 移动开发的性能优化

Confidential All rights reserved

谢谢!