嵌套循环性能

时间:2013-03-09 21:30:20

标签: java performance algorithm loops architecture

性能更好,这个循环:

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++) { }
}

为什么?

7 个答案:

答案 0 :(得分:3)

让我们假设内循环实际上做了一些事情。当然,FredrikRedin和niculare是正确的,内循环执行的数量是相同的。鉴于这种情况,第二个例子是优选的(略),因为第二个例子必须设置内循环十次,而第一个例子设置内循环100次。设置的循环总数:

  • 第一个例子:101
  • 第二个例子:11

由于设置循环需要时间,因此第二个示例是首选,所有其他条件相同(它们从不是)。通常,如果可以在内循环和外循环之间划分迭代,则为内循环提供更多迭代,从而减少外循环的迭代次数。

答案 1 :(得分:0)

实际上它们执行相同数量的迭代,因为'*'是可交换的。在第一种情况下,迭代次数将为100*10,而在第二种情况下,它将为10*100,因此两者都恢复为1000次迭代。

答案 2 :(得分:0)

它的操作次数相同。除非您有跳过迭代和/或任何两个for循环(中断/继续)的逻辑,否则为什么会出现性能差异?

答案 3 :(得分:0)

我不认为他们有相同的表现。原因是分支预测。

答案 4 :(得分:0)

它们是相同的但在原子时间10 * 100更好,因为第一个迭代器包含100个子迭代器并且下一个迭代器的更改是10步并且它优于100步。 为获得最佳效果,您可以使用Atomic Integerbyte来替换intint为32位,byte为8位。

答案 5 :(得分:0)

经验证据表明它们大致相同:

(循环中采用极简主义操作的时间,以毫秒为单位)

第一个1003 ,第二个1113年 第一个1012,第二个1001
前1000 ,第二个1002
第一个1001 ,第二个1006
第一个1013,第二个1001
第一个1001,第二个1001
第一个1007 ,第二个1027 第一个1018,第二个1001
第一个1001 ,第二个1002
第一个1001,第二个1001
第一个1001,第二个1001
第一个1002,第二个1000

理论上,我选择 angelatlarge 的答案。我相信这取决于循环内部的内容:如果你正在构建新的对象等,数百次将慢于数十次。

答案 6 :(得分:0)

允许将javac编译器(将java代码编译为字节码)和JIT(将字节码编译为汇编代码)将两个循环视为无操作(因为循环体中没有任何内容)

实际上,javac不太可能这样做,但很有可能JIT会跳过这段代码。

底线:java代码的性能非常依赖于上下文,对于你没有做任何事情的循环的具体问题,答案是:两者都很可能会被跳过并立即运行。