v8 优化嵌套函数的程度如何

How well does v8 optimise nested functions?

本文关键字:程度如 函数 优化 嵌套 v8      更新时间:2023-09-26

有时我看到这样的代码:

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

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

我不知道

它的优化程度如何,我认为你永远不会得到这样的信息,那种问题太宽泛了,我知道,因为我以前问过这些问题,答案总是"尝试一下,剖析看看"。

话又说回来,我不会回答这么说。

我发现有 2 个来源建议 AGAINST 使用这些,因为它们为引擎添加了另一个步骤,因为它每次都需要创建函数,并向作用域链添加一个级别。

确切的原因和测试在这里:

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

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

这可能应该在评论中,但我还不能发表评论。

我不了解 V8 内部结构,但我认为闭包应该得到很好的优化。但是要回答您问题的另一部分:是的,每个doSomething呼叫都会创建一个新doSomethingElse。这是从语言的角度来看的。从技术上讲,智能 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;
  };
}());

您只需要记住,这将在所有doSomething调用中持续doSomethingElse。因此,如果您执行任何有状态的操作,您可能会看到一些意外行为。