【问题标题】:Does adding curly braces to an arrow function improve performance?向箭头函数添加花括号会提高性能吗?
【发布时间】:2019-06-10 16:41:10
【问题描述】:

我说的是不需要退货的情况。

例如:

let pos = {'x': 1, 'y': 1};
['x', 'y'].forEach((val) => pos[val] = 2);

我很好奇这个隐式返回是否会影响 forEach 的性能?

如果我们添加花括号(因此函数停止返回表达式的结果),会影响性能吗?

【问题讨论】:

  • 基准测试...!?
  • 每个 JavaScript 函数都有一个隐式的 undefined 返回。所以,即使你不返回任何东西,你实际上是在返回一些值被忽略的东西。很快:不,没有任何性能改进。现代 javascript 引擎足够智能,可以单独执行优化例程,forEach 非常优化,因为它是本机代码
  • @CristianTraìna - 不完全是,在规范级别。但在外部,这似乎就是发生的事情。
  • 您也可以添加void 关键字以获得相同的效果...
  • 我还是建议写for (const val of ['x', 'y']) pos[val] = 2;

标签: javascript performance arrow-functions


【解决方案1】:

即使在非常非常大的阵列上,您也无法检测到差异。但如果您好奇,您可以随时在您关心的 JavaScript 引擎上分析它并使用您的真实代码(因为合成代码会给出合成结果)。

在规范方面,评估以return 完成的函数代码(包括箭头的隐式返回)与仅“从”代码末尾“脱落”会导致两种不同的完成,然后是调用过程该函数区分返回和不返回,并在不返回的情况下提供undefinedforEach 的代码当然不会使用结果,但理论上 JavaScript 引擎中可能有不同的代码路径可以到达那里,因此理论上它们的性能可能会略有不同。

不过,在实践中,我认为您可以放心地假设 JavaScript 引擎对此进行了很好的优化,并且差异并不明显。

一般来说,不要提前优化。当您在给定代码位中遇到性能问题时,对给定代码位中的性能问题做出响应。 (也就是说,我完全理解对这种抽象的事情感兴趣......)

只是为了好玩,我做了一个jsPerf,在 Chrome (V8) 或 Firefox (SpiderMonkey) 上的综合测试中没有看到任何显着差异:

但同样,综合测试会给出综合结果。

【讨论】:

    【解决方案2】:

    与大多数性能问题一样,正确的答案是对其进行衡量。

    正如在jsPerf 上看到的那样,差异非常小,而且肯定会被其他事物所抵消,例如the overhead from forEach 等。

    当然,实际上,这种规模的任何差异都是不明显的。

    【讨论】:

      猜你喜欢
      • 2020-06-18
      • 2016-05-28
      • 2022-01-19
      • 2017-05-22
      • 2019-06-18
      • 2020-06-21
      • 1970-01-01
      • 2018-04-25
      相关资源
      最近更新 更多