v8如何优化嵌套函数?

时间:2016-01-15 12:31:04

标签: javascript node.js optimization v8

有时我看到的代码如下:

var doSomething = function(object){
    var results = []
    var doSomethingElse = function(object){
        ...
    }
    results.push(doSomethingElse(...))
    return results
}

以这种方式组织,因为doSomethingElse只在doSomething中有意义。性能是可以接受的,所以这只是一个好奇心:v8对嵌套函数的优化程度如何? 每次调用doSomething()时都会实例化doSomethingElse()的新副本吗?

2 个答案:

答案 0 :(得分:0)

我不知道V8的内部结构,但我认为闭包应该很好地优化。但要回答问题的其他部分:是的,每次doSomethingElse调用都会创建一个新的doSomething。这是从语言的角度来讲。从技术上讲,聪明的JIT可能已经优化了这一点。

如果您对此感到担心,可以通过在自动调用函数中定义doSomethingElse来保证创建var doSomething = (function() { var doSomethingElse = function(object){ // only defined once ... }; return function(object){ // the actual doSomething function var results = []; results.push(doSomethingElse(...)); return results; }; }());

doSomethingElse

您只需要记住,这会在所有doSomething次来电中保持TransformOf。因此,如果您做任何有状态的事情,您可能会看到一些意想不到的行为。

答案 1 :(得分:0)

我不知道它的优化程度如何,我认为你不会得到这样的信息,这类问题太宽泛了,我知道因为我之前已经问了这些问题,答案总是如此"尝试一下,简介并查看"。

然后,我不会回答这么说。

我发现有两个来源推荐使用AGAINST,因为它们为引擎添加了另一个步骤,因为它需要每次都创建函数,并为范围链添加一个级别。

这里的确切原因和测试:

http://code.tutsplus.com/tutorials/stop-nesting-functions-but-not-all-of-them--net-22315

https://developers.google.com/speed/articles/optimizing-javascript

这应该是评论,但我还不能发表评论。