gpt4 book ai didi

javascript - 为什么函数构造函数在 SpiderMonkey 中的性能不如函数定义?

转载 作者:行者123 更新时间:2023-11-29 22:05:52 25 4
gpt4 key购买 nike

通过 this jsPerf , 结构

var fn2 = new Function('return 1 + 2;');

产生一个函数,它比以下定义的函数需要更多的时间来调用:

var fn1 = function() {
return 1 + 2;
};

为什么会这样?显然,开销仅在于调用函数,而不在于运行其主体(因此主体本身显然已优化)。 jsperf 上的其他测试已经证明了这一点。

在动态生成代码(即使用 SpiderMonkey 作为 Javascript JIT 编译器)时使用函数构造函数是有意义的,因此看到性能损失是不好的。 (使用 eval 而不是函数构造函数更快,但是 eval 使整个作用域都可以被函数访问,这不是我想要的。)

看到这个版本很有趣

var fn4 = new Function('return function () { return 1 + 2; }')();

返回函数的速度与上面的 fn1 一样快。但是,这不会破坏内部函数吗,因为它仍然带有一个指向外部函数空范围的句柄? (假设我必须创建许多这样的函数,这样这些微优化才有意义。)

最佳答案

SpiderMonkey JIT 中似乎存在错误,有时无法正确内联使用 new Function 创建的函数。请注意,在这个测试用例中,一旦所有函数都被内联,所有真正被计时的就是空循环,因为函数体是常量并且被循环提升...

无论如何,https://bugzilla.mozilla.org/show_bug.cgi?id=958797跟踪内联问题的修复。

关于javascript - 为什么函数构造函数在 SpiderMonkey 中的性能不如函数定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21026069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com