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

标签 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一样快的函数。但是,这是否会破坏内部函数,因为它仍然带有外部函数的空范围的句柄? (假设我必须创建许多这样的函数,以便这些微观优化才有意义。)

最佳答案

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

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

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

相关文章:

css - 这是 Firefox 的 css 错误吗

c++ - JS_NewContext 中的 JSAPI 段错误

javascript - 如果使用 JS_NewGlobalObject : SpiderMonkey 程序崩溃

javascript - 使用 JS 退出 Google+

javascript - 突出显示<区域>

javascript - Apache 服务器上 WebSocket 的开销

javascript - 如何在 D3.js v.4.x 中设置缩放因子?

css - Internet Explorer 外部 CSS 问题

javascript - 在 Firefox 中获取 SVG <img> 的高度/宽度

javascript - 在控制台中使用 JavaScript 获取用户输入