哪个性能更好,这个循环:
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 10; j++) { }
}
或者这个循环:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 100; j++) { }
}
为什么?
哪个性能更好,这个循环:
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 10; j++) { }
}
或者这个循环:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 100; j++) { }
}
为什么?
让我们假设内部循环实际上做了一些事情。FredrikRedin 和 niculare 当然是正确的,内部循环执行的次数是相同的。鉴于这种情况,第二个示例是首选(稍微),因为第二个示例必须设置内循环十次,而第一个示例设置内循环 100 次。设置的循环总数:
由于设置循环需要时间,因此首选第二个示例,所有其他条件都相同(它们从来都不是)。一般来说,如果可以将迭代分为内循环和外循环,给内循环更多的迭代次数,从而减少外循环的迭代次数。
实际上,它们执行相同数量的迭代,因为“*”是可交换的。在第一种情况下,迭代次数为100*10
,而在第二种情况下为10*100
,因此两者都恢复到 1000 次迭代。
它的操作数量相同。除非您有逻辑跳过迭代和/或两个 for 循环(中断/继续)中的任何一个,否则您为什么期望性能有所不同?
我不认为他们有相同的表现。原因是分支预测。
它们是相同的,但在原子时间 10*100 更好,因为第一个迭代器包括 100 个子迭代器,并且下一个迭代器的更改是 10 步,它优于 100 步。为获得最佳效果,您可以使用Atomic Integer
或byte
替换int
.
int
是32位和byte
8位。
经验证据表明它们大致相同:
(以毫秒为单位的时间,循环中的极简操作)
第一个1003第二个1113
第一个1012第二个1001
第一个1000第二个1002
第一个1001第二个1006
第一个1013第二个1001
第一个1001 第二个1001
第一个1007第二个1027
第一个1018第二个1001
第一个1001第二个1002
第一个1010
第一个 1001,第二个 1001
第一个 1002,第二个 1000
从理论上讲,我同意 angelatlarge的回答。我确实相信这取决于循环内部的内容:如果您正在构建新对象等,数百次将慢于数十次。
javac 编译器(将 java 代码编译为字节码)和 JIT(将字节码编译为程序集)都允许将两个循环视为无操作(因为循环体中没有任何内容)。
在实践中,javac 不太可能这样做,但 JIT 很可能会跳过那段代码。
底线:java代码的性能非常依赖于上下文,对于你关于不做任何事情的循环的具体问题,答案是:两者都很可能会被跳过并立即运行。