background image

如果在用户界面周期内分配对象,会强制一个周期性的垃圾回收,给用户体验造成小

小的停顿间隙。

Gingerbread 中介绍的并发回收也许有用,但应该避免不必要的工作。

因此,避免创建不需要的对象实例。下面是几个例子:

◆如果有一个返回 String 的方法,他的返回值通常附加在一个 StringBuffer 上,改变声

明和实现,这样函数直接在其后面附加,而非创建一个短暂存在的零时变量。

◆当从输入的数据集合中读取数据是,考虑返回原始数据的子串,而非新建一哥拷贝.

这样你会创建一个新的对象,但是他们共享该数据的

char 数组。换来的是即使你仅仅使用

原始输入的一部分,你也需要保证它一直存在于内存中。

一个更彻底的观点是将多维数组切割成一维数组:

◆Int 类 型 的 数 组 比 Integer 类 型 的 好 。 推 而 广 之 , 两 个 平 行 的 int 数 组 要 比 一 个

int,int)型的对象数组高效。这个定理对于任何基本数据类型的组合都通用。

◆如果需要实现存放元组(Foo,Bar)对象的容器,记住两个平行数组 Foo[],Bar[]会优

于一个(

Foo,Bar)对象的数组。(例外情况是:当你设计 API 给其他代码调用时,最好用

好的

API 设计来换取小的速度提升。但在自己的内部代码中,尽量尝试高效的实现。)

通常来说,尽量避免创建短时零时对象

.少的对象创建意味着低频的垃圾回收。这对于

用户体验产生直接的影响。

4.性能之谜

前一个版本的文档给出了好多误导人的主张,这里做一些澄清:

◆在没有 JIT 的设备上,调用方法所传递的对象采用具体的类型而非接口类型会更有效

(比如,传递

HashMap map 比传递 Map map 调用一个方法耗费的开销小,尽管两种情况下

map 都是 HashMap).但这并不是两倍慢的情形,事实上,只相差 6%,而 JIT 使这两种

调用的效率不分伯仲。

◆在没有 JIT 的设备上,访问缓存后的字段比直接访问字段快大概 20%。在有 JIT 的情

况下,字段访问和局部访问耗费是一样的

 。所以这里不值得优化,除非你觉得他会让你的

代码更易读(对于

final,static,及 static final 变量同样适用).

5.用静态代替虚拟

如果不需要访问某对象的字段,将方法设置为静态,调用会加速

15%到 20%。这也是

一种好的做法,因为你可以通过方法声明知晓调用该方法不需要更新此对象的状态。

6.避免内部的 Getters/Setters

在 源 生 语 言 像

C++ 中 , 通 常 做 法 是 用 Getters ( i=getCount() ) 代 替 直 接 访 问 字 段