性能优化A
droid应用程序运行的移动设备受限于其运算能力,存储空间,及电池续航。由此,它必须是高效的。电池续航可能是一个促使你优化程序的原因,即使他看起来已经运行的足够快了。由于续航对用户的重要性,当电量耗损陡增时,意味这用户迟早会发现是由于你的程序。虽然这份文档主要包含着细微的优化,但这些绝不能成为你软件成败的关键。选择合适的算法和数据结构永远是你最先应该考虑的事情,但这超出这份文档之外。
简介写出高效的代码有两条基本的原则:
l不作没有必要的工作。l尽量避免内存分配。
明智的优化这份文档是关于A
droid规范的细微优化,所以先确保你已经了解哪些代码需要优化,并且知道如何去衡量你所做修改所带来的效果(好或坏)。开发投入的时间是有限的,所以明智的时间规划很重要。更多分析和笔记参见总结。这份文档同时确保你在算法和数据结构上作出最佳选择的同时,考虑API选择所带来的潜在影响。使用合适的数据结构和算法比这里的任何建议都更有价值,优先考虑API版本带来的影响有助于你找到更好的实现。(这在类库代码中更为重要,相比应用代码)如果你需要这样的建议,参见JoshBlochsEffectiveJavaitem47在优化A
droid程序时,会遇到的一个棘手问题是,保证你的程序能在不同的硬件平台上运行。虚拟机版本和处理器各部相同,因此运行在之上的速度也大不一样。但这并且不是简单的A比B快或慢,并能在设备间做出排列。特别的,模拟器上只能评测出一小部分设备上体现的东西。有无JIT的设备间也存在着巨大差异,JIT设备上好的代码有时候会在无JIT在的设备上表现的并不好。
如果你想知道一个程序在设备上的具体表现,就必须在上面进行测试。
避免创建不必要的对象对象创建永远不会是免费的。每个线程的分代GC给零时对象分配一个地址池以降低分配开销,但往往内存分配比不分配需要的代价大。如果在用户界面周期内分配对象,就会强制一个周期性的垃圾回收,给用户体验增加小小的停顿间隙。Gi
gerbread中提到的并发回收也许有用,但不必要的工作应当被避免的。因此,应该避免不必要的对象创建。下面是几个例子:
l如果有一个返回Stri
g的方法,并且他的返回值常常附加在一个Stri
gBuffer上,改变声明和实现,让函数直接在其后面附加,而非创建一个短暂存在的零时变量。
f
l当从输入的数据集合中读取数据时,考虑返回原始数据的子串,而非新建一个拷贝这样你虽然创建一个新的对象,但是他们r