首页 > 解决方案 > 在 Javascript 中,当它们都迭代相同的次数时,为什么 'while(true' 比 'for(...)' 慢?

问题描述

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

根据jsbench,使用_while(true)

这是我在 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

解决方案


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

你的代码

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

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

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

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

汇编

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

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


推荐阅读