background image

无论怎样,基于

android 的设备也是嵌入式设备。现代的手持设备,与其说是电话,更像一台拿在手中的电脑。

但是,即使是 最快 的手持设备,其性能也达不到一台普通的台式电脑。

 

这就是为什么我们在书写

Android 应用程序的时候要格外关注效率。这些设备并没有那么快,并且受电池电量的

制约。这意味着,设备没有更多的能力,我们必须把程序写的尽量有效。

 

本文讨论了很多能让开发者使他们的程序运行更有效的方法,遵照这些方法,你可以使你的程序发挥最大的效力。

 

引言

对于占用资源的系统,有两条基本原则:

 

不要做不必要的事

不要分配不必要的内存

所有下面的内容都遵照这两个原则。

 

有些人可能马上会跳出来,把本节的大部分内容归于 草率的优化 ,不可否认微优化的确会带来很多问题,诸如
无法使用更有效的数据结构和算法。但是在手持设备上,你别无选择。假如你认为

Android 虚拟机的性能与台式

机相当,你的程序很有可能一开始就占用了系统的全部内存,这会让你的程序慢得像蜗牛一样,更遑论做其他的
操作了。

 

Android 的成功依赖于你的程序提供的用户体验。而这种用户体验,部分依赖于你的程序是响应快速而灵活的,
还是响应缓慢而僵化的。因为所有的程序都运行在同一个设备之上,都在一起,这就如果在同一条路上行驶的汽
车。而这篇文档就相当于你在取得驾照之前必须要学习的交通规则。如果大家都按照这些规则去做,驾驶就会很
顺畅,但是如果你不这样做,你可能会车毁人亡。这就是为什么这些原则十分重要。

 

当我们讨论实质性问题之前,还必须要提醒大家一点:不管

VM 是否支持实时(JIT)编译器,下面提到的这些原

则都是成立的。假如我们有目标完全相同的两个方法,在解释执行时

foo()比 bar()快,那么编译之后,foo()

依然会比

bar()快。所以不要寄希望于编译器可以拯救你的程序。

 

避免建立对象

世界上没有免费的对象。虽然

GC 为每个线程都建立了临时对象池,可以使创建对象的代价变得小一些,但是分配

内存永远都比不分配内存的代价大。

 

如果你在用户界面循环中分配对象内存,就会引发周期性的垃圾回收,用户就会觉得界面像打嗝一样一顿一顿的。