node.js真的没有优化对[] .slice.call(arguments)的调用吗?

时间:2014-05-07 05:19:25

标签: node.js optimization

bluebird docs中,他们将此作为反模式停止优化..他们称之为参数泄漏

function leaksArguments2() {
    var args = [].slice.call(arguments);
}

我在Node.js中一直这样做这真的是一个问题。如果是这样,为什么?

仅假设最新版本的Node.js.

2 个答案:

答案 0 :(得分:13)

免责声明:我是维基页面的作者

如果包含的函数被调用很多(很热),这是一个问题。优化编译器(曲轴)不支持泄漏arguments的函数。

通常当功能很热时,它会被优化。但是,如果该函数包含不支持的功能(如泄漏arguments),那么作为热门函数无效并且它将继续运行缓慢的通用代码。

与未经优化的功能相比,优化功能的性能是巨大的。例如,考虑一个将3个双打加在一起的函数:http://jsperf.com/213213213 21x差异。

如果一起添加6个双打怎么办? 29x difference通常,函数具有的代码越多,该函数在未优化模式下运行的惩罚就越严重。

对于node.js来说,这样的东西实际上是一个很大的问题,因为任何cpu时间都会完全阻塞服务器。只有by optimizing the url parser包含在节点核心中(我的模块在节点自己的基准测试中快30倍),在queries a database的基准测试中将mysql-express的每秒请求数从70K rps提高到100K rps。 / p>

好消息是node core is aware of this

答案 1 :(得分:-2)

  

这真的是一个问题

对于应用程序代码,没有。对于几乎所有模块/库代码,没有。对于像bluebird这样的库,它可以在整个代码库中普遍使用,是的。如果您在应用程序中使用非常热门的功能,那么可能是的。

我不知道细节,但我相信蓝鸟作者可信,以文档中描述的方式访问arguments导致v8拒绝优化函数,因此蓝鸟作者认为这是值得使用构建时宏来获得优化版本。

请记住首先引起节点的延迟数。如果你的应用程序做了很多有用的事情,比如与数据库或文件系统交谈,那么I / O将成为你的瓶颈,优化/缓存/并行化这些将比上面的v8级内存微优化支付更高的分红。 / p>