【问题标题】:Does the complexity of a closure affect the performance cost of creating it?闭包的复杂性会影响创建它的性能成本吗?
【发布时间】:2021-01-14 14:44:35
【问题描述】:

假设我有以下 React 钩子:

export const useSomeState = (someProps: {}) => {
  return React.useState(() => {
    // Some really complex function with lots of code
  })
}

因为我们使用的是 React.useState 的函数处理程序,所以状态应该只初始化一次.. 没关系...

如果这个钩子被用作经常重新渲染的较大组件的一部分,这会影响性能吗?还是我需要使用 React.useCallback 之类的?

JS 创建和重新创建一个永远不会运行的闭包(在每次重新渲染时)的性能成本是多少?

闭包的复杂性(捕获并放入堆中的变量数量)是否会影响性能成本?

【问题讨论】:

  • 你考虑过使用useMemo hook吗?
  • 如果你不打算改变这个状态,为什么要在一个状态下使用函数?
  • @adirabargil 因为 useState() 的函数版本只在组件挂载时执行一次

标签: javascript reactjs typescript web dom


【解决方案1】:

我对重新创建多个闭包的第一个问题不是速度成本,而是内存成本。创建超过 1 个变量和 10 个变量的闭包之间几乎没有区别,但这确实需要少量的堆分配。大量的小堆分配会导致内存碎片化,需要运行更多的垃圾收集,这会在奇怪且不可预测的时间影响性能。

如果您的闭包在每个动画帧上都重新创建,那么是的,您可能应该改进代码。如果它只是在主要内容中重新渲染某些页面,你可能没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2021-04-18
    相关资源
    最近更新 更多