2014-05-07 26 views
13

bluebird docs,他们有这个作为优化停止反模式。他们把它叫做参数泄漏node.js是否真的不优化对[] .slice.call(参数)的调用?

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

我这样做所有的时间在Node.js的这真的是一个问题。如果是这样,为什么?

假设只有最新版本的Node.js。

+0

他们正试图使的一点是,参数是为V8做优化的关键。鉴于你如何可以mutate [参数在函数](http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language)类似的方式这意味着V8必须重新检查已经存在的签名。因为这个V8永远无法猜测数据类型以优化函数调用。 – user568109

+0

@ user568109优化编译器支持'arguments'的某些用法 - 那些不需要实例化'arguments'对象的参数,例如arguments [i]或arguments.length(其中i是有效索引) – Esailija

+0

Yes,提及作为[文档](https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#3-managing-arguments)第3部分末尾的安全用法。 – user568109

回答

-2

这是一个真正的问题

对于应用程序的代码,没有。对于几乎任何模块/库代码,不。对于像蓝鸟这样的图书馆,其目的是在整个代码库中普遍使用,是的。如果你在应用程序中使用了非常热门的功能,那么也许是。

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

请记住引起节点的延迟数字。如果您的应用程序执行诸如与数据库或文件系统对话等有用的事情,那么I/O将成为您的瓶颈,优化/缓存/并行化这些将比上述的v8级内存微优化支付更高的分红。

+0

不知道问题的细节问*为什么*没有那么有用。你只是认为蓝鸟的优化是为了Node,而不是别的。或者,它甚至可以工作。 –

+0

我知道这不是您可能希望得到的综合答案,我希望其他人发布这样的答案。这不是“信仰”,但它确实依赖于关于v8特别明确的蓝鸟文档。至于它是否有效,考虑到你的代表,你显然能够写2个.js文件来证明/反驳你自己的满意。您应该澄清您是否意指“为什么v8拒绝优化这些功能”vs“为什么这是性能问题”。对前者的回答通常是“他们还没有找到安全的方式”。 –

12

免责声明:我的wiki页面

的作者这是一个问题,如果包含函数被调用了很多(即热)。优化编译器(曲轴)不支持泄漏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。

好消息是,node core is aware of this

+0

我怎么可能知道什么是热的?这是wikipage唯一的资源吗?这对我来说是全新的。从来没有听说过这个。事实上,我有补丁提交在这里。这是非常基本的东西,我一直在做错 - 和[我认为比我好得多的人](https://github.com/visionmedia/node-thunkify/pull/12) –

+1

@EvanCarroll “热门功能”意味着一个被称为很多的功能,通过理解程序,使用分析器或计数器等知道哪些功能被称为很多功能。 – Esailija

+0

aww,我认为hot在这种情况下意味着可以优化。问题依然存在,是否有一个更权威的来源,说明在V8中可比蓝鸟的wiki页面优化什么?是否存在%GetOptimizationStatus 1-6的描述,以及它们究竟是什么意思,以及导致这些状态的原因。 –