将相同的数组/对象元素分配给同一元素的性能

时间:2018-04-19 08:39:29

标签: javascript performance v8

我很好奇将相同元素分配给自己的表现。 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());

1 个答案:

答案 0 :(得分:1)

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

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

关于obj.key vs obj[e](对于加载和存储),如果它们只看到一个对象形状而只看到一个属性名称,那么它们的性能几乎相同。如果[e]看到多个属性名称(例如循环遍历Object.keys()的示例),则会稍慢一些;然而,.key并不是真正的替代选择 - [e]的灵活性使其变得更慢。如果他们中的任何一个看到obj的多个形状,那么它们会慢于其他形状,[e].key受到更大的打击;这将是例如当您的循环最终添加之前没有的属性时就是这种情况。

所有这一切,任何性能差异可能都太小而无关紧要,我的建议是编写最具可读性的代码 - 或运行自己的测量结果以确定是否存在' sa在你的情况下可衡量的差异。请记住,微基准测试通常会产生误导;使用尽可能接近生产环境的应用程序进行此类测试。