javascript - 为什么在生成器中调用函数运行得更快?

标签 javascript firefox v8 geckodriver firefox-quantum

function* test() {
  console.time("function-call")
  loop();
  console.timeEnd("function-call");

  console.time("in-function");
  var i, j;
  i = 0;
  while (i < 10000) {
    j = 0;
    while (j < 10000) {
      j++
    }
    i++;
  }
  console.timeEnd("in-function");
}

function loop() {
  var i, j;
  i = 0;
  while (i < 10000) {
    j = 0;
    while (j < 10000) {
      j++
    }
    i++;
  }
}

test().next();

我复制了“循环”中的代码块,并粘贴到“测试”函数中以比较时间。

function-call: 84ms 
in-function: 596ms

调用函数比在函数内部循环要快得多。为什么会这样?

最佳答案

@Cristian Traìna 节点不允许跳过空循环。这些优化只允许在带有 -O2 标志的编译语言(如 Pascal 或 C/C++)中使用。

对于这个程序

var max=process.argv[2];
for(var i=0;i<=max;i++){} // with let results is the same

我们可以从多个循环中得到以下执行时间的相关性。它是一个 LogLog 图表。当占据部分执行时间时,它域的第一个平面区域是 NodeJs 的启动。在 1M 循环之后,您可以看到随着时间线性增加的迭代次数。最高测量需要大约 1000 秒,所以肯定 V8 不会跳过空循环。


(来源:gustawdaniel.pl)

从问题回到脚本:

  • Chrome 71.0.3578.98
function-call: 154.878662109375ms
in-function: 153.7490234375ms
  • 节点 v10.15.0
function-call: 154.183ms
in-function: 152.907ms
  • Firefox Quantum 64.0
function-call: 156 ms debugger eval code:4:3
in-function: 1519 ms
  • Chrome 71.0.3578.98
function-call: 158.954345703125ms
in-function: 153.663818359375ms
  • 维瓦尔第 2.2
function-call: 153.548095703125ms
in-function: 153.755126953125ms
  • 歌剧 58.0.3135.47
function-call: 154.34814453125ms
in-function: 154.729248046875ms

我 friend 的电脑测试:

  • 边缘
function-call: 3 496,6 ms
in-function: 2 330,9 ms
  • Chrome
function-call: 70.69580078125ms
in-function: 70.43310546875ms

所以现在看来​​是 Firefox 和 Edge 的问题。

除 Firefox 和 Edge 之外,所有这些浏览器都使用 V8 引擎。此处描述了 Firefox:

https://www.digitaltrends.com/web/mozilla-firefox-new-browser-engine-quantum-2017/

并使用量子流:

边缘团队考虑采用Chromium引擎

https://www.pcmag.com/news/365345/microsofts-edge-browser-to-adopt-googles-chromium-engine

来自这篇文章

https://blog.mozilla.org/blog/2018/12/06/goodbye-edge/

我们可以看到, future 只有 Google 的 ChromiumMozilla 的 Gecko Quantum 会被支持。

如果有人可以访问 Safari 或 Edge,请附加测试。

关于javascript - 为什么在生成器中调用函数运行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54345711/

相关文章:

html - Firefox 48 是否删除了设置选择元素样式的功能?

javascript - 如何让 Html5 音频在点击时播放声音? (ogg 适用于 Firefox 等浏览器,mp3 适用于 chrome 等浏览器)

c++ - v8 作用域是如何工作的?

javascript - 使用 lodash 根据类型对多个对象进行分组

javascript - 当输入被清除时输入值重置

javascript - Node-SASS 源映射不适用于 React-JS

javascript - Firefox 弹出窗口锁定父窗口直到它关闭

javascript - 如何使用jquery根据数量更新价格

javascript - 将 nodejs c++ 插件的速度与等效的 js 进行比较?

eclipse - NodeJS Eclipse V8 deb