首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回路效率

回路效率
EN

Stack Overflow用户
提问于 2010-10-20 08:45:00
回答 3查看 137关注 0票数 0

我看到了关于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)被要求避免的大小是否为可迭代类型?

另外,如果我们有无限的数据(假设数据以流的形式出现),我们应该考虑哪个循环才能提高效率?)

请你对此发表评论。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-20 08:51:31

如果这是他们推荐的,那就是他们对编译器和VM进行优化的原因。您认为相同的操作不一定是以相同的方式实现的:编译器可以通过数据和路径分析使用各种技巧,以避免天真昂贵的操作。例如,可以缓存array.length()结果,因为数组是不可变的。

他们的排名从最高到最低:但是(1)是“不自然的”。我同意,不是吗?(7)的问题是创建了迭代器对象,并且必须对其进行GC‘编辑。

注意,什么时候应该听取建议。它显然是针对已知集合上的有界迭代,而不是流情况。只有当回路对性能和能耗有显著影响(“在计算机规模上操作”)时,它才是相关的。优化的第一定律是“不要优化”。第二个定律(对于专家)是“不要优化,现在。”首先测量(执行时间和CPU消耗),然后进行优化:这甚至适用于移动设备。

您应该考虑的是前面的幻灯片:尽可能频繁和尽可能长地睡眠,同时快速响应更改。你是如何做到这一点的,这取决于你要处理的是哪种流。

最后,请注意,该演示文稿已有两年历史,可能不完全适用于实现JIT的2.2设备。

票数 0
EN

Stack Overflow用户

发布于 2010-10-20 08:50:14

有了无限的数据,所有的例子都不够好。最好的办法就是

代码语言:javascript
复制
for(;;) {
   list.poll(); //handle concurrency, in java for example, use a blocking queue
}
票数 0
EN

Stack Overflow用户

发布于 2010-10-20 09:14:36

1)和2)真的不一样。2)需要额外的减法才能计算i=0。更好的是,在大多数处理器(以及优化的代码)中,i>=0不需要进行比较。处理器可以使用负旗,最后一次减少(i-)。

所以循环-1的结尾看起来像(在伪汇编程序中)

代码语言:javascript
复制
--i
jump-if-neg

而循环2

代码语言:javascript
复制
++i
limit-i  # set negative flag if i >limit
jump-if-neg

这并没有太大的区别,除非您的循环中的代码非常小(比如基本的C字符串操作),而这些代码可能不适用于解释语言。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3976091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档