基于运行时 const 的 V8 死代码消除

问题描述 投票:0回答:1

这与 V8 是否能够根据 `const` 的值消除死代码? 除了不是导出的

const
之外,我有以下 JavaScript 代码:

// ... a `state` object is available as well as `newKey` and `newVal` strings and `isEqual` boolean
const newObj = { ...state.obj, [newKey]: newVal };
return isEqual ? state : { ...state, obj: newObj };

预热的 V8 是否可以注意到,仅当

newObj
为 false 时才使用
isEqual
,并避免分配
newObj

我知道,如果我绝对想避免不必要的

newObj
分配,我应该将其移至条件 (
isEqual ? state : {...state, obj: {...}}
) 或根据
isEqual
(
const newObj = isEqual ? undefined : {...}
) 有条件地分配它。我想更好地了解 V8 是否能够基于 runtime const 消除这种死代码,以更好地实现可读性与性能的权衡。

(我了解分析、过早优化等,我们假设我有充分的理由避免在这部分代码中进行不必要的分配。)

javascript optimization v8
1个回答
1
投票

(这里是 V8 开发者。)

在快速测试中,

newObj
的分配不会被推入条件分支。对象是无条件分配的,只有在之后才会考虑
isEqual ?
决策。

也就是说,我个人认为在这种特殊情况下可读性和性能之间没有任何权衡。恕我直言,

  if (isEqual) return state;
  return { ...state, obj: { ...state.obj, [newKey]: newVal } };

(如果您愿意,可以选择使用

else
)将更具可读性和更高的性能。

FWIW,整个问题与“死代码消除”无关。这里没有可以消除的死代码。您询问的是如何将操作移至条件分支。我不知道“运行时常量”是什么意思。

© www.soinside.com 2019 - 2024. All rights reserved.