前言
性能优化本身是一个很大的主题,涵盖程序的方方面面,任何不慎的操作,都有可能对性能造成比较大的影响,要知道程序的性能是可以累加的,多处的性能低下,会影响整体的性能,其后果可能也是多方面的,本文总结了目前工作中,所需要知道的大部分性能优化点,一部分个人总结,一部分来自于互联网。但整体上,都是提纲性的,并没有列出具体的实例,因为写这方面主题的达人实在太多了,所以,我得站在巨人的肩膀上,具体细节,请参考对应的链接。
性能低下的现象
1 |
- 游戏:界面很卡,FPS低 |
性能低下的后果:降低用户体验
1 |
- 用户流失 |
容易引发性能问题的点
1 |
- 硬件 |
从全局考虑
1 |
- 硬件性能 |
从微观考虑
1 |
- 小规模修改程序,提高性能:程序的性能是可以累加的 |
一些观点
1 |
- 高效代码≠更好代码≠高质量代码(易修改,易扩充,易维护) |
方法论
Key Points
1 |
- 是否考虑通过修改需求来提高性能? |
性能瓶颈的发现
找出瓶颈,集中火力对付占用绝大部分资源的少量代码。
途径:
1. Code Review
通过最基本优化策略优化代码
2. 代码性能测量
a) 通过性能Log记录函数调用时间,找出瓶颈点
1 |
Log.d("Performance", "Load media info begin......"); |
b) 使用性能分析工具:
- Traceview(参考:Android性能调优工具TraceView介绍)
- Monkey
- MonkeyRunner
注:后两个我个人没有使用过,不做介绍,优先推荐使用TraceView工具
如何优化?
优化本身是一个很大的主题,我这是主要是针对于Android平台来说的。个人认为,优化可以分成好几部分:
- 一是JAVA语法层次通用的优化,如尽量使用局部变量(栈变量),IO缓冲等。
- 二是通用的Android性能优化,如同步改异步,各种缓存的使用等
- 三是应用程序内部的性能优化,如内部逻辑、数据插入及查找、数据结构的安排与组织等
以下部分针对于上述3种类型,分别进行简要说明:
1. 基本优化策略:JAVA语法层次的优化
(以下部分来自于:http://blog.csdn.net/aomandeshangxiao/article/details/8115612#t1,具体做法请参考该连接)
类和对象使用技巧
1 |
- 尽量少用new生成新对象 |
Java
IO技巧
1 |
- 使用缓冲提高IO性能 |
线程使用技巧
1 |
- 在使用大量线程Threading的场合使用线程池管理 |
其它常用技巧
1 |
- 使用移位操作替代乘除法操作可以极大地提高性能 |
实际上,Android本身的Training文档也提供给我们很多可参考的内容,以下仅枚举一些KeyPoint,当然,有的内容是与上面的策略是重复的。
- 原文参考:Performance Tips
- 译文参考:Android应用开发者指南:性能优化(1)
- 其它参考:Android开发性能优化简介
总体上来说,想要写出高效代码,我们要遵循两条基本的原则:
- 不作没有必要的工作。
- 尽量避免内存分配。
Key Point
1 |
- 避免创建不必要的对象 |
2. 通用Android性能优化
布局优化
(原文参考:ImprovingLayout Performance)
- 尽量减少Android程序布局中View的层次,View层次越多,效率就越低
- 使用复用布局
- 使用ViewStub懒加载布局 (Android布局技巧:使用ViewStub提高UI性能)
- 使用ViewHolder、Thread使ListView滚动更加流畅
其它优化点
- 合理使用异步操作
- 懒加载:当前不需要的数据,不要加载,即按需加载。懒加载的范围是广泛的,可以是数据,可以是View,或者其它
- 使用缓存
- 图片缓存:包括MemoryCache和DiskCache,可以使用官方DEMO中的Cache,参考:Displaying Bitmaps Efficiently
- 单例数据缓存:建立一个管理数据的类,管理所有数据,当主界面消失后,由于Application本身没有实际退出,因此,数据本身也没有释放掉,下次启动时,省去了加载数据的时间,当然,这并不是一个好的行为。
- 使用ListView、GridView的View缓存
- 使用Message自身的缓存,避免重复创建Message实例
- 线程池
- 数据池(可参考Message Pool的实现方式)
- ……
- 数据库优化
- SQL优化
- 建立索引
- 使用事务
- ……
- 算法优化
- 用快速排序代替冒泡排序
- 用二分查找代替线性查找
- ……
- 数据结构使用
- 不要全部使用ArrayList,合理使用LinkedList等易于插入和删除的集合
- 合理使用HashMap、HashSet来提高查找性能
- 使用SparseArray、SparseIntArray、SparseBooleanArray来替代某些特定的HashMap
- ……
- 其它策略
- 可以考虑延迟处理,避免在同一时间干过多的事情
3. 应用程序内部的性能优化
该部分的优化应该是依据程序的不同而不同,没有万般皆准的法则,目前从我做过的程序来看,实际上,上述的性能优化点基本上已经能够解决很多性能问题了。
在我所做的程序中,主要的优化手段是:
- 程序逻辑简化:分析代码,去掉冗余逻辑
- 数据结构的优化:对集合类的灵活使用,特别是HashMap的使用,极大的提高查找性能。
- 批量处理原则:对于需要循环调用地方,采用批量处理
总结
性能优化本身是对代码的重构和反思过程,通过优化性能,能找出我们很多设计、逻辑上的不足。
优化的过程往往很痛苦,但在做过这个过程后,个人在编程水平、设计水平上都会有很大的提高。
很多优化的思想应该做为编码规范的一部分,需要我们反复实践,在写代码时,第一反应所得出的代码就是最优的。