Javascript 为什么在生成器中调用函数运行得更快?
Javascript 为什么在生成器中调用函数运行得更快?,javascript,firefox,v8,geckodriver,firefox-quantum,Javascript,Firefox,V8,Geckodriver,Firefox Quantum,函数*test(){ 控制台时间(“函数调用”) loop(); console.timeEnd(“函数调用”); 控制台时间(“功能中”); varⅠ,j; i=0; 而(i
函数*test(){
控制台时间(“函数调用”)
loop();
console.timeEnd(“函数调用”);
控制台时间(“功能中”);
varⅠ,j;
i=0;
而(i<10000){
j=0;
而(j<10000){
j++
}
i++;
}
控制台。时间结束(“功能中”);
}
函数循环(){
varⅠ,j;
i=0;
而(i<10000){
j=0;
而(j<10000){
j++
}
i++;
}
}
test().next()代码>@Cristian Traìna节点不允许跳过空循环。这些优化仅在Pascal或C/C++等编译语言中允许,并带有-O2
等标志
为了这个节目
var max=process.argv[2];
for(var i=0;i<=max;i++){} // with let results is the same
- 节点v10.15.0
- FirefoxQuantum 64.0
- 铬71.0.3578.98
- 维瓦尔第2.2
- 歌剧58.0.3135.47
我朋友的电脑测试:
- 边缘
- 铬
所以现在Firefox和Edge似乎出现了问题
除Firefox和Edge之外的所有浏览器都使用V8引擎。Firefox描述如下:
并使用量子流:
Edge团队考虑采用铬发动机
从这篇文章
我们可以看到,将来只支持Google的Chromium和Mozilla的Gecko Quantum
如果有人可以访问Safari或Edge,请附加测试。我的猜测是优化器意识到您的循环函数什么都不做(i
和j
不能在循环外访问,循环中也没有发生任何事情),因此对其进行了优化。但由于某些原因,当循环处于更大的上下文中时,相同的优化没有被捕获。在Chrome(v8引擎)上,in函数稍微快一点。我在firefox上复制了你的结果。有趣的question@JoachimSauer实际上,我有类似的代码块,可以做一些事情。我准备了一个简化的版本来提问。在节点js上测试函数调用:154.183ms,在函数中:152.907ms,@Cory,你能添加你的原始代码吗。有趣的是,把在函数中
函数封装在IIFE中,它运行得更快。因此,@JoachimSauer的猜测可能是100%正确的。也许我们不应该问为什么函数调用
更快,但为什么在函数中
速度较慢好吧,我从来没有说过V8跳过空循环,但即使我没有说,也可能是真的。即使JavaScript不是一种编译语言,最现代的引擎也会执行一些即时编译,并提前查看代码,以便对代码进行预测和优化。如果我没有弄错的话,V8至少使用了两个线程,一个用于优化,一个用于执行。我同意这两个你没有说它,它可能是真的。我观察到只在编译语言中跳过空循环,并且只使用特殊标志。我的意思是Node在这个任务中没有特别优化,因为他的速度是许多脚本语言(如php、perl、python、ruby)在空循环中的典型速度,Node也在这个组中。这是一个带有执行时间对数的图表,一个循环没有这个特殊的flasg(值越小,速度越快)
function-call: 154.878662109375ms
in-function: 153.7490234375ms
function-call: 154.183ms
in-function: 152.907ms
function-call: 156 ms debugger eval code:4:3
in-function: 1519 ms
function-call: 158.954345703125ms
in-function: 153.663818359375ms
function-call: 153.548095703125ms
in-function: 153.755126953125ms
function-call: 154.34814453125ms
in-function: 154.729248046875ms
function-call: 3 496,6 ms
in-function: 2 330,9 ms
function-call: 70.69580078125ms
in-function: 70.43310546875ms