繁体   English   中英

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

[英]Why calling a function in generator runs faster?

 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 节点不允许跳过空循环。 这些优化只允许在 Pascal 或 C/C++ 等编译语言中使用-O2标志。

对于这个程序

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

从问题回到脚本:

  • 铬 71.0.3578.98
function-call: 154.878662109375ms
in-function: 153.7490234375ms
  • 节点 v10.15.0
function-call: 154.183ms
in-function: 152.907ms
  • 火狐量子 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
  • 维瓦尔第 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
  • 铬合金
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,请附加测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM