为什么函数构造函数在SpiderMonkey中的性能低于函数定义?

时间:2014-01-09 16:40:46

标签: javascript firefox spidermonkey

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一样快的函数。然而,这不是爆炸内部功能,因为它仍然带有外部功能的空范围的句柄? (假设我必须创建许多这些函数,以便这些微优化可能有意义。)

1 个答案:

答案 0 :(得分:2)

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

在任何情况下,https://bugzilla.mozilla.org/show_bug.cgi?id=958797都会跟踪内联问题的修复程序。

相关问题