作者: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/