按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
一样快的函数。然而,这不是爆炸内部功能,因为它仍然带有外部功能的空范围的句柄? (假设我必须创建许多这些函数,以便这些微优化可能有意义。)
答案 0 :(得分:2)
看起来SpiderMonkey JIT中存在一个错误,它有时无法正确内联使用new Function
创建的函数。请注意,在这个测试用例中,所有函数都被内联后,所有真正定时的都是空循环,因为函数体是常量并且被循环提升...
在任何情况下,https://bugzilla.mozilla.org/show_bug.cgi?id=958797都会跟踪内联问题的修复程序。