在性能优化工作中,选择正确的算法和数据结构应始终是您的首要任务。
编写高效代码有两个基本规则:
- 不需要做的工作就不要做
- 如果可以避免,就不要分配内存
在微优化 Android 应用时,您会遇到的最棘手的问题之一是应用肯定会在多种类型的硬件上运行。不同版本的虚拟机会在不同的处理器上以不同的速度运行。通常并不能简单地用一句话“设备 X 比设备 Y 快/慢 F 倍”概括,也不能把由一台设备产生的结果扩展到其他设备上。特别是,在模拟器上得出的测量结果很难说明在任何设备上的性能。有 JIT 的设备和没有 JIT 的设备之间也存在巨大差异:最适合有 JIT 的设备的代码并不一定最适合没有 JIT 的设备。为了确保应用在各种设备上都能达到很好的性能,请确保代码在所有级别都很高效,并积极优化应用性能。
始终衡量性能
在开始优化之前,请先找到需要解决的问题。请确保您可以准确衡量现有性能,否则便无法衡量所尝试的替代方案带来的优势。
您还可以使用 Traceview 分析性能,但务必注意,Traceview 目前会停用 JIT,这可能会导致其将时间成本错误地归因于启用 JIT 后也许能够消除的代码。在实施 Traceview 数据所建议的更改后,请确保所产生的代码在没有 Traceview 的情况下运行时速度确实更快了。
避免创建不必要的对象
创建对象绝不是没有成本的。带有针对临时对象的线程级分配池的分代垃圾回收器可以降低分配成本,但分配内存的成本总是要高于不分配内存。随着您在应用中分配越来越多的对象,您会强制进行定期垃圾回收,导致用户体验出现小“问题”。
以下是对您有所帮助的一些措施的示例:
- 如果您有一个返回字符串的方法,并且您知道其结果无论如何都会附加到某个
StringBuffer
,则更改签名和实现,以便函数直接进行附加,而非创建短期的临时对象。 - 从一组输入数据中提取字符串时,请尝试返回原始数据的子字符串,而非创建副本。您会创建一个新的
String
对象,但它会与这些数据共享char[]
。