js 为数组提供了许多函数式方法,用起来很优雅直观,但实际上是有性能损失的。
例如有这样一个浮点数组:
const numbers = Array.from({ length: 10_000 }).map(() => Math.random())
我们分别用函数式和命令式做同相同的操作。
函数式:
// 1. functional
const result =
numbers
.map(n => Math.round(n * 10))
.filter(n => n % 2 === 0)
.reduce((a, n) => a + n, 0)
命令式
// 2. imperative
let result = 0
for (let i = 0; i < numbers.length; i++) {
let n = Math.round(numbers[i] * 10)
if (n % 2 !== 0) continue
result = result + n
}
执行效率比对如下:
![](https://img.haomeiwen.com/i25380/29409d49642406b4.png)
原因是函数式实现中,调用了3次数组方法,每一次都需要遍历N个元素,而命令式只需要遍历一次。同时,数组方法还涉及到数组拷贝,这些拷贝后的数据后面还需要垃圾回收。
对象方法,例如 Object.values()
, Object.keys()
和 Object.entries()
也有类似问题。
网友评论