1、7个思想:
- 了解编程语言的编译原理,使用高效编码方式从语法上提高程序性能
- 采用合理的数据结构和算法提高程序性能,决定程序性能的关键
- 采用多线程、缓存数据、延迟加载、提前加载等手段,解决严重的性能瓶颈
- 合理配置虚拟机堆内存使用上限和使用率,减少垃圾回收频率
- 合理使用native代码
- 合理配置数据库缓存类型和优化SQL语句加快读取速度,使用事务加快写入速度
- 使用工具分析性能问题,找出性能瓶颈
2、2个原则
- 不执行不必要的操作
- 不分配不必要的内存
具体优化策略
1、合理使用static成员
- 如果一个方法不需要操作运行时的动态变量和方法,那么可以将方法设置为static的
- 常量字段要声明为“static final”,因为这样常量会被存放在dex文件的静态字段初始化器中被直接访问,否则在运行时需要通过编译时自动生成的一些函数来初始化,此规则只对基本类型和String类型有效。
- 不要将视图控件声明为static,因为View对象会引用Activity对象,当Activity退出时其对象本身无法被销毁,会造成内存溢出
2、避免内部的Getters/Setters
面向对象设计中,字段访问使用Getters/Setters通常是一个好的原则,但是在Android开发中限于硬件条件,除非字段需要被公开访问,否则如果只是有限范围内的内部访问(例如包内访问)则不建议使用Getters/Setters。在开启JIT时,直接访问的速度比间接访问要快7倍。
3、数据类型的选择
- 字符串拼接用StringBuilder代替String,在非并发情况下用StringBuilder代替StringBuffer
如果你对字符串的长度有大致了解,如100字符左右,可以直接new StringBuilder(128)指定初始大小,减少空间不够时的再次分配。 - 64位类型如long double的处理比32位如int慢
- final类型存储在常量区中读取效率更高
4、 数据结构选择
常见的数据结构选择如:
- ArrayList和LinkedList
ArrayList根据index取值更快,LinkedList更占内存、随机插入删除更快速、扩容效率更高。一般推荐ArrayList。 - ArrayList、HashMap、LinkedHashMap、HashSet
hash系列数据结构查询速度更优,ArrayList存储有序元素,HashMap为键值对数据结构,LinkedHashMap可以记住加入次序的hashMap,HashSet不允许重复元素。 - HashMap、WeakHashMap
WeakHashMap中元素可在适当时候被系统垃圾回收器自动回收,所以适合在内存紧张型中使用。 - Collections.synchronizedMap和ConcurrentHashMap
ConcurrentHashMap为细分锁,锁粒度更小,并发性能更优。Collections.synchronizedMap为对象锁,自己添加函数进行锁控制更方便。 - Android也提供了一些性能更优的数据类型,如SparseArray、SparseBooleanArray、SparseIntArray、Pair
Sparse系列的数据结构是为key为int情况的特殊处理,采用二分查找及简单的数组存储,加上不需要泛型转换的开销,相对Map来说性能更优