数组方法的性能损失

2024-09-13  本文已影响0人  alue

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
}

执行效率比对如下:

原因是函数式实现中,调用了3次数组方法,每一次都需要遍历N个元素,而命令式只需要遍历一次。同时,数组方法还涉及到数组拷贝,这些拷贝后的数据后面还需要垃圾回收。

对象方法,例如 Object.values(), Object.keys()Object.entries() 也有类似问题。

上一篇 下一篇

猜你喜欢

热点阅读