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