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

Are arrow functions optimized like named functions?

我在看一个 NodeJS Interactive 演讲,那个人说匿名函数有多糟糕,原因之一是如果他们没有名字,VM 无法根据函数的使用频率优化函数,因为它是无名的.

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

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

randomFunc可以优化为where函数如:

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

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

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

random.Async('Blah', (cb) => {});被优化了?

编辑:寻找 link 那个家伙提到这个的谈话,会报告回来。 (这个演讲是很久以前的事了,只是我从中记住的)

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

我相信 Matteo 指的是调用次数很少的函数(例如,只调用一次的回调),v8 优化与函数是否真正匿名无关。

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

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

在 10000 次迭代中,命名函数似乎在 chromium 的 V8 实现中完成得最快。 Arrow function 似乎 return 结果比匿名函数花费的时间更少。

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/