尽量减少对象的创建,从而减少GC次数。包括:
- 减少不必要的中间变量:包括函数局部变量、返回值等
- 对于String,最好使用substring,此时新的String是原始数据的子集的引用
- int比Integer要快
- 对于一个Bean的数组,可以转变为多个基本类型的数组的集合,减少对象的创建,可以参考ArrayMap
如果不需要访问对象的成员变量,尽量使用static方法。会有15%-25%的性能提升
- 对于基本类型常量,使用static final可以减少一次对象初始化
- 在不用proguard的情况下,在对象内部尽量不用getter/setter,而是直接访问成员变量。getter/setter只是对外接口。没有JIT,能快3倍,有JIT能快7倍。Proguard会自动将getter/setter inline化
- 对于一般for循环,尽量使用for-each。对于数组,尽量使用手写的int i循环。但是要把数组长度提取出来作为局部变量
- 对于内部类访问外部类的private变量,实际上是VM为外部类的成员变量生成了一系列权限为package的getter/setter方法,供内部类使用。此时最佳实践是将外部类成员变量的访问权限设置为package,供内部类直接使用
- 经验上讲,float比int慢两倍。部分处理器上除法可能没有硬件支持
- Iterator(以及使用Iterator的foreach)会严重拖慢代码运行速度,ArrayList上会有2倍的性能差
- Invalidate尽量传入Rect,onDraw时尽量调用Canvas.clipRect(),查看是否需要重绘Canvas.quickReject()
- 在创建对象时,可能由于内存不足被GC阻塞
- 对于autoboxing和unboxing,会有时间和空间的额外开销,对于Map类的,可以转用SparseXXXMap
谷歌官方建议笔记——性能
最新推荐文章于 2023-10-08 13:03:58 发布