【发布时间】:2012-07-31 20:54:11
【问题描述】:
以下列表来自 2008 年名为“Dalvik Virtual Machine Internals”的谷歌 I/O 演讲,它列出了按效率从高到低依次循环一组对象的方法:
(1) for (int i = initializer; i >=0; i--) //hard to loop backwards
(2) int limit = calculate_limit(); for (int i= 0; i< limit; i++)
(3) Type[] array = get_array(); for (Type obj : array)
(4) for (int i =0; i< array.length; i++) //gets array.length everytime
(5) for (int i=0; i < this.var; i++) //has to calculate what this.var is
(6) for (int i=0; i < obj.size(); i++) //even worse calls function each time
(7) Iterable list = get_list(); for (Type obj : list) //generic object based iterators slow!
前 3 个效率相同,如果可能,请避免 7 个。这主要是帮助延长电池寿命的建议,但也可能有助于 Java SE 代码。
我的问题是:为什么 (7) 慢,为什么 (3) 好?我认为这可能是(3)和(7)的数组和列表之间的区别。此外,正如 Dan 提到的 (7) 创建了大量必须进行 GC 处理的小型临时对象,我现在对 Java 有点生疏了,有人可以解释为什么吗?它在他的talk video 中,时间为 0:41:10。
【问题讨论】:
-
请注意,这只适用于 ArrayList(如果有的话)。按索引迭代到 LinkedList 非常昂贵。 (7) 只会创建一个临时对象,我真的怀疑差异是否可测量。我大多数程序都花时间对列表中的每个对象做一些事情,而不是迭代机制本身......
标签: java android optimization dalvik