嵌套循环性能[关闭]

Posted

技术标签:

【中文标题】嵌套循环性能[关闭]【英文标题】:Nested loops performance [closed] 【发布时间】:2013-02-25 07:17:56 【问题描述】:

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

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

为什么?

【问题讨论】:

你为什么不测试一下看看?我投了反对票,因为你的问题应该是“这个代码更快,你能帮我理解为什么吗?” 您的第一个代码在语法上不正确..! 是什么让您认为存在显着差异? 差异不会很大,但第二个例子会更快。 @MartijnCourteaux 你为什么这么认为? 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

第一个 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 的回答。我确实相信这取决于循环内部的内容:如果您正在构建新对象等,数百次将比数十次慢。

【讨论】:

结果取决于你运行了多少次——如果你将它们包含在一个方法中并多次调用该方法,时间很可能会下降到0。 @assylias 当代码被优化(第一次发生)时循环为空时,很容易将时间变为 0。如果您在循环/秒中有一个 Thread.sleep(1),我保证时间不会下降到 0!【参考方案4】:

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

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

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

【讨论】:

你的意思正好相反,对吧?第一个示例有 100 次迭代,并设置了 100 次内循环。 是的。会编辑,你当然是对的。 "因为设置循环需要时间" => 为什么?能详细点吗? 好吧,至少循环控制变量必须初始化。【参考方案5】:

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

【讨论】:

您能否详细说明您的想法。为什么两个循环中的分支预测会不同? 这没有意义:代码中只有一个分支。 如果你看一下汇编代码你会发现有多个分支......每次将两个索引(i和j)与9和99进行比较时都会有一个分支......跨度> 【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于嵌套循环性能[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

列表理解循环排序取决于嵌套[关闭]

C ++ ifstream嵌套循环[关闭]

理解 javascript 嵌套 for 循环的问题 [关闭]

如何理解和完成下面提供的嵌套循环挑战[关闭]

如何使用 Python 输出嵌套循环的结果 [关闭]

使用嵌套循环迭代 m^n 组合[关闭]