我在我的服务器上运行了这段代码,我注意到运行两个单独的循环与单个 for 循环之间存在性能差异,有人可以解释为什么吗?
for(let k=0;k<100000000;k++) {
let s = Date.now();
for(let i=0;i<1e9;i++) { i + 100 }
for(let i=0;i<1e9;i++) { i + 100 }
let s1 = Date.now() - s;
s = Date.now();
for(let i=0;i<2e9;i++) { i + 100 }
let s2 = Date.now() - s;
console.log(s1, s2 , s1 - s2)
}
这些是我的 json 结果:https://pastebin.com/bRqku0zJ
最佳答案
我也在 dev2 中发布了这个问题。感谢da-ti。 https://dev.to/dati/comment/eii1
This has nothing to do with JIT compiler, loops, multi-threading or BigInt. If this was a some quiz question it would test: -Understating that every number in js implicitly is floating point number -Knowing how floating point addition works and that (unlike addition of integers) it takes multiple hw level operations
To make this test fair for both one loop variant and two loops variant:
s = Date.now() for(let i=0;i<1e10;i++) { i + 100 } for(let i=1e10;i<2e10;i++) { i + 100 } console.log(Date.now() - s) s = Date.now() for(let i=0;i<2e10;i++) { i + 100 } console.log(Date.now() - s)
Now both variants work with exact same numbers and perform exact same floating point operations (time diff is consistently <20ms on my machine now, where it was 500-1500ms before)
TLDR: floating point
关于javascript - 为什么在 js 中运行两个单独的循环与运行单个 for 循环之间存在性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57711752/