为什么在生成器中调用函数运行速度更快?

时间:2019-01-24 11:35:36

标签: javascript firefox v8 geckodriver firefox-quantum

try
            {
                await faceServiceClient.DeletePersonGroupAsync(_groupId);
            }
            catch (Microsoft.ProjectOxford.Common.ClientException exC)
            {

            }
            catch (FaceAPIException ex)
            {

            }

我将代码块复制到“循环”中,并粘贴到“测试”功能中以比较时间。

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();

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

1 个答案:

答案 0 :(得分:1)

@CristianTraìna节点不允许跳过空循环。仅在诸如Pascal或C / C ++之类的编译语言中带有-O2等标志,才允许进行这些优化。

对于此程序

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

我们可以从多个循环中获得以下执行时间依赖性。它是一个LogLog图表。当控制执行时间的一部分时,它所定义的第一个平坦区域是NodeJ的启动。 1M循环后,您可以看到迭代缩放的数量随时间线性增加。最高的测量大约需要1000秒,因此,V8绝对不会跳过空循环。

从问题返回脚本:

  • 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
  • 铬71.0.3578.98
function-call: 158.954345703125ms
in-function: 153.663818359375ms
  • Vivaldi 2.2
function-call: 153.548095703125ms
in-function: 153.755126953125ms
  • 歌剧58.0.3135.47
function-call: 154.34814453125ms
in-function: 154.729248046875ms

我的朋友的计算机进行测试:

  • 边缘
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/

,并使用Quantum Flow:

Edge团队考虑采用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/

我们可以看到将来仅支持Chromium from GoogleGecko Quantum from Mozilla

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