箭头函数是否像命名函数一样优化?

时间:2016-04-20 02:30:45

标签: javascript node.js optimization arrow-functions

我正在观看一场NodeJS互动式演讲,而那个人说的是匿名功能是如何糟糕的原因之一是,如果他们没有名字,VM无法根据其使用频率来优化功能,因为它无名。 / p>

因此,如果调用具有名称的函数

random.Async('Blah', function randomFunc() {});

randomFunc可以像以下函数一样进行优化:

random.Async('Blah', function(cb) {});

这不会被优化,因为它是匿名的,无名的。

所以我想知道箭头函数是否会做同样的事情,因为我认为你不能命名箭头函数。

威尔

random.Async('Blah', (cb) => {});会进行优化吗?

编辑:寻找链接到该人提到的谈话,将报告回来。 (这次谈话是从不久前开始的,这是我记得的一件事)

编辑找到视频:https://youtu.be/_0W_822Dijg?t=299

2 个答案:

答案 0 :(得分:1)

我相信Matteo所指的是几次被调用的函数(例如只调用一次的回调),而v8优化与函数是否实际上是匿名无关。

另外,如果你继续观看,他提到使用一个名为reusify的模块,该模块基本上提供了一系列功能。通过使用它,这意味着您可以从池中获取可能已经优化的功能,这意味着可以执行比典型的一次性使用回调更快。然而,并非所有用例都可以使用这样的东西。

答案 1 :(得分:1)

注意,不完全确定这些是链接视频演示中讨论的模式比较。

在10000次迭代中,命名函数似乎在铬的V8实现时完成得最快。 Arrow function似乎以比匿名函数更短的时间返回结果。

在100000次迭代中,匿名函数在最短的时间内完成; 64.51ms小于命名函数,而箭头函数比命名函数花费4902.01ms更多时间。

    var len = Array.from({
      length: 100000
    })

     // named function
    function _named() {

      console.profile("named function");
      console.time("named function");

      function resolver(resolve, reject) {
        resolve("named function")
      }

      function done(data) {
        console.log(data)
      }

      function complete() {
        console.timeEnd("named function");
        console.profileEnd();
        return "named function complete"
      }

      function callback() {
        return new Promise(resolver).then(done)
      }

      return Promise.all(len.map(callback)).then(complete);
    }

     // anonymous function
    function _anonymous() {
      console.profile("anonymous function");
      console.time("anonymous function");

      return Promise.all(len.map(function() {
          return new Promise(function(resolve, reject) {
              resolve("anonymous function")
            })
            .then(function(data) {
              console.log(data)
            })
        }))
        .then(function() {
          console.timeEnd("anonymous function");
          console.profileEnd();
          return "anonymous function complete"
        })
    }

     // arrow function
    function _arrow() {
      console.profile("arrow function");
      console.time("arrow function");

      return Promise.all(len.map(() => {
          return new Promise((resolve, reject) =>
              resolve("arrow function")
            )
            .then((data) => {
              console.log(data)
            })
        }))
        .then(() => {
          console.timeEnd("arrow function");
          console.profileEnd();
          return "arrow function complete"
        })
    }

    _named().then(_anonymous).then(_arrow)

jsfiddle https://jsfiddle.net/oj87s38t/