将相同的 array/object 元素分配给相同元素的性能

Performance of assigning the same array/object element to the same element

我很好奇将相同的元素赋值给自己的性能。 V8 是否足够聪明以理解不应执行此操作?

obj.key = obj.key;

用例类似于。

Object.keys(otherObj).forEach(e => {
  if(!obj[e]) {
    obj[e] = foo();
  }
});

如果我们使用三元运算符而不是 if 语句,性能会受到惩罚吗?

Object.keys(otherObj).forEach(e => obj[e] = obj[e] ? obj[e] : foo());

这里是 V8 开发人员。我认为 obj[e] = obj[e] 分配不会被优化掉。确定这样的优化是有效的需要关于 obje 的大量知识,以至于在大多数情况下检查所有这些都太昂贵而不值得。

正如 Bergi 指出的那样,obj[e] = (... ? obj[e] : ...) 在概念上要复杂得多,因此即使您假设我们会再花几年时间改进 V8,也不太可能被优化掉。

关于 obj.keyobj[e](对于加载和存储),如果他们都只看到一个对象形状和一个 属性 名称,他们将拥有几乎相同的性能。如果 [e] 看到多个 属性 名称(就像在您的示例中循环遍历 Object.keys()),它会稍微慢一些;然而 .key 并不是真正的替代方案——恰恰是 [e] 的灵​​活性让它变慢了。如果他们中的任何一个看到 obj 的多个形状,他们会比其他情况慢,[e].key 受到更大的打击;这将例如当您的循环最终添加以前不存在的属性时就是这种情况。

综上所述,任何性能差异都可能太小而不重要,我的建议是编写最易读的代码 -- 或者 运行 您自己的测量以确定是否存在可测量的你的情况有所不同。请记住,微基准测试通常具有误导性;使用尽可能接近您的生产环境的应用程序进行此类测试。