方法链的性能影响与创建不同的变量

时间:2015-09-22 22:33:03

标签: javascript

给定一组过滤数组并减少/求和结果的操作:

function arbitrary() {
  return [1,2,3].
    filter((i)=>{return i > 1}).
    reduce((prev,cur)=>{return prev+cur})
}

...我的假设是使用filter的结果创建临时数组,并将指针/引用传递给reduce。

如果重写这个以使用临时变量:

function arbitrary() {
  var filtered = [1,2,3].filter((i)=>{return i > 1});
  return filtered.reduce((prev,cur)=>{return prev+cur});
}

...在内存使用和性能方面是否相同,假设变量在超出范围时被垃圾收集?

为了澄清,我理解这可以被视为微观优化,我不会问这是否是最佳实践。我对更好地了解javascript引擎如何在内部运作感兴趣。

1 个答案:

答案 0 :(得分:1)

这种级别的微优化很少值得修改您的代码。尽可能以最清晰的方式编写代码。我倾向于按照以下顺序考虑这些编码优先级:正确,清晰,健壮,可重复使用,评论并具有适当的性能基本上按顺序排列。由于这个问题的性能差异不太可能是相关的,并且它是最后的优先事项,因此它之前的其他优先事项应该指导思考。

如果你只是想知道内部发生了什么,你会发现可能差别很小。

当您运行.filter()时,您的任一代码示例中都会生成一个新数组。这部分操作在任何一个中都没有区别。

因此,两者之间的唯一区别是,在第二个代码示例中,您将其分配给临时变量,然后在该临时变量上调用.reduce()。在第二个代码示例中没有生成新的数组,只创建了一个额外的局部变量和一个额外的变量赋值。在函数中正在进行的其他操作的一般方案中(特别是如果数组具有任何合理的大小),您正在进行许多其他函数调用,因此这个额外的变量赋值不太可能是相关的。

也就是说,如果其他任何东西都不需要中间值,那么很多人会通过链接结果来推断代码更清晰,因为不需要保留中间结果或分配它甚至没有那个变量。 / p>

所有这一切,这不是一个普遍的事实。链接并不总是更好的解决方案。有时,代码变得如此复杂,以至于将一个长的巨型链式语句分解为一些命名的中间结果会使代码更容易理解,并且在某些情况下,更容易调试(因为它更容易看到中间结果)。在你的特定代码中,一些链式操作看起来非常好,所以我个人不会使用中间变量。