@Cristian Traìna Node 不允许跳过空循环。这些优化只允许在编译型语言中使用,例如 Pascal 或带有类似 -O2
标志的 C/C++。
对于此程序
var max=process.argv[2]
for(var i=0
我们可以从循环次数得到执行时间的依赖关系。这是一个LogLog图表。第一个平坦区域是NodeJs开始占据主导执行时间的领域。在1M次循环后,您可以看到迭代次数的增加与时间呈线性比例关系。最高测量时间约为1000秒,因此V8肯定不会跳过空循环。
(来源:gustawdaniel.pl)
回到问题的脚本:
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
我朋友的电脑测试结果如下:
注意:该文本包含HTML标签,已保留。
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和来自Mozilla的Gecko Quantum。
如果有人能够访问Safari或Edge,请添加测试。
i
和j
在循环外无法访问,循环内也没有任何操作),因此被优化掉了。但出于某种原因,当循环处于更大的上下文中时,同样的优化并没有生效。 - Joachim Sauerin-function
函数封装在IIFE中运行速度更快。所以@JoachimSauer的猜测可能是100%正确的。也许我们不应该问为什么function-call
更快,而应该问为什么in-function
更慢。 - Christian Vincenzo Traina