【问题标题】:Are arrow functions optimized like named functions?箭头函数是否像命名函数一样优化?
【发布时间】:2016-08-12 11:33:16
【问题描述】:

我正在观看 NodeJS 交互式演讲,演讲的人说匿名函数有多糟糕,原因之一是如果它们没有名称,VM 无法根据使用频率优化该函数,因为它是无名的。

所以如果调用一个有名字的函数

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

randomFunc 可以优化为如下函数:

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

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

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

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

编辑:寻找那个人提到这一点的谈话的链接,将报告。 (这个演讲是很久以前的,只是我记得的)

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

【问题讨论】:

  • "匿名函数有多糟糕的原因之一是,如果它们没有名称,VM 无法根据其使用频率优化该函数,因为它是无名的。" --- 这需要适当的确认,因为这听起来很不对。名称纯粹是为开发人员而存在的,VM 可以随意将其更改为任何喜欢的名称。
  • (cb) => {}) 已经优化了。你想用它优化什么?
  • 你能提供一个演讲的链接吗?
  • @RobG 这就是我的观点(“一般来说,没有什么能保证性能是相同的”):“性能”没有绝对价值(甚至不确定人们说“优化”时的意思“在这个线程中 - 因为虚拟机使用这个术语来表示非常具体的东西)。它会因数千个不同的细微差别而有所不同。
  • 我将听到此消息的视频添加到主帖

标签: javascript node.js optimization arrow-functions


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    在 10000 次迭代时,命名函数在 Chromium 的 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/

    【讨论】:

      猜你喜欢
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-06
      • 2018-08-11
      • 2020-06-30
      相关资源
      最近更新 更多