以下两个循环之间的性能差异(如果有的话)是什么?
for (Object o: objectArrayList) {
o.DoSomething();
}
和
for (int i=0; i<objectArrayList.size(); i++) {
objectArrayList.get(i).DoSomething();
}
原文由 eflles 发布,翻译遵循 CC BY-SA 4.0 许可协议
以下两个循环之间的性能差异(如果有的话)是什么?
for (Object o: objectArrayList) {
o.DoSomething();
}
和
for (int i=0; i<objectArrayList.size(); i++) {
objectArrayList.get(i).DoSomething();
}
原文由 eflles 发布,翻译遵循 CC BY-SA 4.0 许可协议
所有这些循环都完全相同,我只想在投入我的两分钱之前展示这些。
首先,循环遍历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 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
来自 Joshua Bloch 的 Effective Java 中的第 46 条: