在bluebird docs中,他们将此作为反模式停止优化..他们称之为参数泄漏,
function leaksArguments2() {
var args = [].slice.call(arguments);
}
我在Node.js中一直这样做这真的是一个问题。如果是这样,为什么?
仅假设最新版本的Node.js.
答案 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>
答案 1 :(得分:-2)
这真的是一个问题
对于应用程序代码,没有。对于几乎所有模块/库代码,没有。对于像bluebird这样的库,它可以在整个代码库中普遍使用,是的。如果您在应用程序中使用非常热门的功能,那么可能是的。
我不知道细节,但我相信蓝鸟作者可信,以文档中描述的方式访问arguments
导致v8拒绝优化函数,因此蓝鸟作者认为这是值得使用构建时宏来获得优化版本。
请记住首先引起节点的延迟数。如果你的应用程序做了很多有用的事情,比如与数据库或文件系统交谈,那么I / O将成为你的瓶颈,优化/缓存/并行化这些将比上面的v8级内存微优化支付更高的分红。 / p>