javascript - 在 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 的编译方式有关。不过,在此示例中,这些差异是非常无关紧要的,因此每次运行代码时,更快的测试都会有所不同,并且结果非常不确定。通常,它们应该花费大约相同的时间,或者稍微快一点或慢一点。
你的代码
您的while
循环将继续,因为您将条件设置为 always be true
。您没有包含一个条件来检查它是否应该在每次迭代完成后的任何时候停止。
for
另一方面,您的循环有一个条件,每次迭代完成时都会检查一次(检查是否i < arr.length
仍然存在)。
除此之外,您的代码几乎相同。它们都有相同的代码块,不同之处在于while
循环i
在其代码块内递增,而不是像for
循环在其内部代码块i
之后递增。
在这种情况下,差异是无关紧要的。
汇编
如果您曾经研究过一些汇编代码,那么您应该对循环的一些结构有点熟悉。
根据代码的编译方式确定哪些操作/指令以什么顺序运行。此外,循环的结构while
通常应该与for
汇编中的循环不同,这意味着可能有额外的指令在for
循环中运行而不是在while
循环中运行,反之亦然,具体取决于编程语言。
推荐阅读
- python-3.x - 如何使用 python 在 perforce 中创建分支并避免编辑器通过参数传递映射
- testing - 运行 TestCafe 时,页面似乎没有加载
- swift - XCTAssertThrowsError 由于抛出错误而失败。XCTAssertThrowsError 失败:在 JSON 写入中抛出无效类型(NSObject)
- javascript - Vue element-io折叠侧菜单问题
- rust - 移动圆弧
进入线程池 - xml - 如何使用 XPath contains()
- powershell - PowerShell:脚本无法打开存档中的本机文件,但能够打开新创建的文件
- verilog - Verilog 测试台未正确读取测试向量
- javascript - 使用 JS 从字符串中删除
- oracle - 填补累积查询的空白