【问题标题】:Are two for loops slower than a bigger one?两个 for 循环是否比一个更大的循环慢?
【发布时间】:2020-07-22 16:43:25
【问题描述】:

哪段代码更快

一号:

for(var i = 0; i<50; i++){
    //run code in here
}
for(var i = 0; i<50; i++){
    //run more code in here
}

或者2号:

for(var i = 0; i<100; i++){
    //run all the code in here
}

谢谢!

【问题讨论】:

  • 您可以尝试设置一个计时器并自己测量。但是对于这么小的循环计数,它将可以忽略不计,并且可能没有意义。清晰和逻辑应该在这里占上风。
  • 我怀疑会有很多明显的差异。选择对特定用例有意义的任何东西。通常,您不会将两个循环与一个较大的循环互换。
  • 1 号运行“所有代码”50 次,2 号运行“所有代码”100 次..

标签: javascript arrays performance for-loop optimization


【解决方案1】:

正如在另一个答案中已经指出的那样,两个循环产生相同的 O(N) 缩放行为(对于循环体中发生的任何事情以及缩放循环长度 50 和 100,分别. 该点通常是伴随幂项的比例因子 (c . XN)。 p>

在用于性能相关计算的许多(大多数)真实 CPU 系统上,通常有缓存和管道用于在循环内操作的数据。然后,问题的答案取决于循环体的详细信息(循环中读取/写入的所有数据是否适合某个级别的缓存,或者第二个 50 循环是否会丢失所有现有缓存值,并从再次记忆?)。此外,分支预测的推测(循环退出/重复分支以及循环内部的分支)对实际性能有复杂的影响。

准确地考虑所有相关细节是计算科学的一个独立部分。应该分析具体的例子(循环实际上做了什么?) - 之前,whether this loop is actually relevant

一些启发式方法可能仍然有用: 如果i 是一个迭代器(而不仅仅是一个重复计数器),那么两个 1..50 循环可能正在处理相同的数据。 如果可以通过两个循环体处理每个元素(只有在第二个循环和第一个循环之后其他元素的状态之间没有依赖关系时才有效),通常只处理每个索引一次更有效。

【讨论】:

    【解决方案2】:

    这将取决于它们内部的逻辑(嵌套循环等)。从理论上讲,它们的运行方式相同,因为它们都是线性的。 (两者都是 100 次迭代)。所以大 O 时间复杂度是 O(N),其中 N 是循环的大小。

    Big O Time Complexity

    【讨论】:

    • 如果在任何条件下(理想系统)对每条指令和内存的访问都需要相同的时间,这是正确的。在实际系统中(除了极少数非常小的/早期的 CPU),会产生显着影响。在典型的 HPC 问题中,这可能会导致长时间的节省/损失。 编辑: 两条路径的 Bit O 复杂度确实相同(如果 N 是插入循环范围 (2x50) 的复杂度,或者是循环体的复杂度 ("运行...这里的代码”)。问题是乘以 X**N** 的比例因子。在实现低 N 之后,这因子是“prio-2”。
    猜你喜欢
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2021-07-28
    • 1970-01-01
    相关资源
    最近更新 更多