JavaScript实现Σ求和函数:单for循环和多个内置方法哪个更快?
两种JavaScript Σ求和函数性能对比
结论非常明确:for循环实现的capitalSigma运行速度更快,求和区间越大二者性能差距越明显
原因主要有三点:
- 额外内存开销:数组内置方法实现的版本首先需要用
Array.from生成一份长度为求和区间长度的临时数组,调用map的时候还会生成第二份临时数组,两份数组完全是中间产物,求和结束后就要被回收。当你求和区间长度到几万、几十万的时候,光是生成这两个大数组的开销就已经远超过for循环的累加开销了。而for循环版本只用到一个累加变量,没有额外的数组内存占用。 - 多余遍历次数:你观察到的多次遍历问题确实存在:
Array.from填充数组要遍历一次,map计算func返回值要遍历一次,reduce累加还要遍历一次,总共三次全量遍历。而for循环只需要走一次,边遍历调用func边累加,完全没有多余的遍历步骤。 - 回调函数开销:JS中函数调用本身就有固定开销,数组内置方法的每个步骤都要执行回调,多次回调的开销累加起来也远高于for循环里单次调用func的开销。
如果你确实想用数组内置方法写简洁的版本,也可以优化掉map步骤,把func的计算放到reduce里,减少一次遍历:
function 𝝨(start, stop, func) { return Array.from({length: (stop - start) + 1}, (_, i) => start + i) .reduce((sum, curr) => sum + func(curr), 0) }
就算做了这个优化,性能还是远不如for循环版本,追求运行效率优先选for循环实现即可。
内容的提问来源于stack exchange,提问作者gurkensaas
相关产品推荐
相关产品推荐

