我看到了关于Dalvik的演示文稿(dalvik-vm-内部件),在下面提到的循环中,我们使用了use (2)和(3),并避免了(7)。
(1)对于(int I=初始化器;i >= 0;i-)
(2) int极限=计算极限;for (int i= 0;i<极限;i++)
(3) Type[]数组= get数组;for ( obj :数组类型)
(4)对于(int = 0;i< array.length;i++)
(5)对于(int = 0;i< this.var;i++)
(6)对于(int = 0;i< obj.size();i++)
(7) Iterable list = get list;for (Type obj : list)
评论:我觉得(1)和(2)是一样的。(3) (4)每次都要计算数组的长度,这样就可以避免(5) (6)与(4)相同,每次(7)被要求避免的大小是否为可迭代类型?
另外,如果我们有无限的数据(假设数据以流的形式出现),我们应该考虑哪个循环才能提高效率?)
请你对此发表评论。
发布于 2010-10-20 08:51:31
如果这是他们推荐的,那就是他们对编译器和VM进行优化的原因。您认为相同的操作不一定是以相同的方式实现的:编译器可以通过数据和路径分析使用各种技巧,以避免天真昂贵的操作。例如,可以缓存array.length()结果,因为数组是不可变的。
他们的排名从最高到最低:但是(1)是“不自然的”。我同意,不是吗?(7)的问题是创建了迭代器对象,并且必须对其进行GC‘编辑。
注意,什么时候应该听取建议。它显然是针对已知集合上的有界迭代,而不是流情况。只有当回路对性能和能耗有显著影响(“在计算机规模上操作”)时,它才是相关的。优化的第一定律是“不要优化”。第二个定律(对于专家)是“不要优化,现在。”首先测量(执行时间和CPU消耗),然后进行优化:这甚至适用于移动设备。
您应该考虑的是前面的幻灯片:尽可能频繁和尽可能长地睡眠,同时快速响应更改。你是如何做到这一点的,这取决于你要处理的是哪种流。
最后,请注意,该演示文稿已有两年历史,可能不完全适用于实现JIT的2.2设备。
发布于 2010-10-20 08:50:14
有了无限的数据,所有的例子都不够好。最好的办法就是
for(;;) {
list.poll(); //handle concurrency, in java for example, use a blocking queue
}发布于 2010-10-20 09:14:36
1)和2)真的不一样。2)需要额外的减法才能计算i=0。更好的是,在大多数处理器(以及优化的代码)中,i>=0不需要进行比较。处理器可以使用负旗,最后一次减少(i-)。
所以循环-1的结尾看起来像(在伪汇编程序中)
--i
jump-if-neg而循环2
++i
limit-i # set negative flag if i >limit
jump-if-neg这并没有太大的区别,除非您的循环中的代码非常小(比如基本的C字符串操作),而这些代码可能不适用于解释语言。
https://stackoverflow.com/questions/3976091
复制相似问题