for 循环和 for-each 循环之间是否存在性能差异?

新手上路,请多包涵

以下两个循环之间的性能差异(如果有的话)是什么?

 for (Object o: objectArrayList) {
    o.DoSomething();
}

for (int i=0; i<objectArrayList.size(); i++) {
    objectArrayList.get(i).DoSomething();
}

原文由 eflles 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 403
2 个回答

来自 Joshua Bloch 的 Effective Java 中的第 46 条:

1.5 版中引入的 for-each 循环通过完全隐藏迭代器或索引变量消除了混乱和出错的机会。由此产生的习语同样适用于集合和数组:

 // The preferred idiom for iterating over collections and arrays
for (Element e : elements) {
    doSomething(e);
}

当您看到冒号 (:) 时,将其读作“in”。因此,上面的循环读作“对于元素中的每个元素 e”。请注意,即使对于数组,使用 for-each 循环也不会降低性能。事实上,在某些情况下,它可能比普通的 for 循环略有性能优势,因为它只计算数组索引的限制一次。虽然您可以手动执行此操作(条目 45),但程序员并不总是这样做。

原文由 Vijay Dev 发布,翻译遵循 CC BY-SA 2.5 许可协议

所有这些循环都完全相同,我只想在投入我的两分钱之前展示这些。

首先,循环遍历List的经典方式:

 for (int i=0; i < strings.size(); i++) { /* do something using strings.get(i) */ }

其次,首选方法,因为它不太容易出错(你做了多少次“哎呀,在循环中的这些循环中混合变量 i 和 j”的事情?)。

 for (String s : strings) { /* do something using s */ }

三、微优化的for循环:

 int size = strings.size();
for (int i = -1; ++i < size;) { /* do something using strings.get(i) */ }

现在实际的两美分:至少当我测试这些时,第三个是最快的,当计算每种类型的循环所花费的时间毫秒数时,其中一个简单的操作重复了几百万次 - 这是使用 Java 5如果有人感兴趣,可以在 Windows 上使用 jre1.6u10。

虽然至少看起来第三个是最快的,但你真的应该问问自己是否愿意冒险在你的循环代码中到处实施这种窥视孔优化,因为据我所见,实际循环不是’这通常是任何实际程序中最耗时的部分(或者也许我只是在错误的领域工作,谁知道呢)。而且就像我在 Java for-each 循环 的借口中提到的那样(有些人将其称为 _Iterator 循环_,其他人称为 _for-in 循环_),您在使用它时不太可能遇到那个特定的愚蠢错误。在讨论它如何比其他的更快之前,请记住 javac 根本不优化字节码(好吧,几乎根本不优化),它只是编译它。

如果您正在进行微优化和/或您的软件使用大量递归循环等,那么您可能对第三种循环类型感兴趣。请记住,在将 for 循环更改为这个奇怪的、微优化的循环之前和之后,都要对您的软件进行基准测试。

原文由 P Arrayah 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题