【问题标题】:In Javascript, why is 'while(true' slower than 'for(...)' when they are both iterating the same number of times?在 Javascript 中,当它们都迭代相同次数时,为什么 'while(true' 比 'for(...)' 慢?
【发布时间】:2021-09-18 04:06:33
【问题描述】:

假设while(true) 将与for(...) 循环同时中断,为什么for(...) 更快?

根据jsbench,使用while(true)会慢7%

这是我在 jsbench 中使用的代码:

使用while(true) 循环


/* generate array */
const arr = []
for(let i = 0; i < 1000; i++){
    arr.push(i)
}

let i = 0
while(true){
    if(arr[i] >= 900){
        return;
        
    }
    i++
}

使用for(...) 循环:


/* generate array */
const arr = []
for(let i = 0; i < 1000; i++){
    arr.push(i)
}

for(let i = 0; i < arr.length; i++){
    if(arr[i] >= 900){
        return;
    }
}

【问题讨论】:

标签: javascript


【解决方案1】:

时间与您的代码和 JavaScript 的编译方式有关。但是,在此示例中,这些差异非常无关紧要,因此每次运行代码时,更快的测试都会有所不同,并且结果非常不确定。通常,它们应该花费大约相同的时间,或者稍微快一点或慢一点。

您的代码

您的while 循环将继续,因为您将条件设置为始终为true。你没有包含一个条件来检查它是否应该在每次迭代完成后的任何时候停止。

另一方面,您的for 循环有一个条件,每次迭代完成时都会检查一次(检查i &lt; arr.length 是否仍然存在)。

除此之外,您的代码几乎相同。它们都有相同的代码块,不同之处在于while循环在其代码块内递增i,而不是像for循环在其内部递增i之后代码块。

在这种情况下的差异是无关紧要的。

编译

如果你曾经研究过一些汇编代码,你应该对循环的一些结构有点熟悉。

根据代码的编译方式决定了哪些操作/指令以什么顺序运行。此外,while 循环的结构通常应该不同于汇编中的for 循环,这意味着在for 循环与while 循环中运行可能有额外的指令,反之亦然,具体取决于编程语言。

【讨论】:

  • 既然for循环有更多指令要运行,不应该比while慢吗?
猜你喜欢
  • 2020-11-07
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2017-12-17
  • 1970-01-01
  • 2015-10-20
相关资源
最近更新 更多