-6

哪个性能更好,这个循环:

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

为什么?

4

7 回答 7

3

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

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

由于设置循环需要时间,因此首选第二个示例,所有其他条件都相同(它们从来都不是)。一般来说,如果可以将迭代分为内循环和外循环,给内循环更多的迭代次数,从而减少外循环的迭代次数。

于 2013-03-09T21:37:06.397 回答
0

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

于 2013-03-09T21:33:44.017 回答
0

它的操作数量相同。除非您有逻辑跳过迭代和/或两个 for 循环(中断/继续)中的任何一个,否则您为什么期望性能有所不同?

于 2013-03-09T21:34:12.410 回答
0

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

于 2013-03-09T21:50:35.060 回答
0

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

于 2013-03-09T21:55:50.007 回答
0

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

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

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

从理论上讲,我同意 angelatlarge的回答。我确实相信这取决于循环内部的内容:如果您正在构建新对象等,数百次将慢于数十次。

于 2013-03-09T22:51:08.317 回答
0

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

在实践中,javac 不太可能这样做,但 JIT 很可能会跳过那段代码。

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

于 2013-03-10T01:23:19.823 回答