javascript 使用reduce或for循环来计算数组中值的和更好吗?为什么?[duplicate]

bcs8qyzn  于 2023-01-01  发布在  Java
关注(0)|答案(4)|浏览(129)
    • 此问题在此处已有答案**:

Why is using "for...in" for array iteration a bad idea?(28个答案)
昨天关门了。
我已经在JavaScript中找到了两种计算相同事物的方法,我只是想知道哪种方法在内存使用和处理能力方面更有效:

AveragePL = netArray.reduce((sum,arr) => sum + arr, 0);

for (let index in netArray) {
  AveragePL = AveragePL + netArray[index];
}

我意识到我可以做AveragePL += netArray [index],但是我是JS的新手,所以我使用完整的形式,这样我就可以知道发生了什么。

g52tjvyc

g52tjvyc2#

这实际上取决于JS引擎的实现。
此外,还有不同类型的for循环for..infor..of和经典的for
经典的for是最优化的,所以在大多数实现中,它会击败所有其他的实现,包括reduce方法,它必须为每个迭代执行一个函数。

for (let i = 0, len = netArray.len; i < len; i++){
    AveragePL = AveragePL + netArray[i];
}

在firefox中你可以看到下面的扩展基准测试。
参见https://jsben.ch/xU8Nd

5lwkijsr

5lwkijsr3#

使用我可以使用的node版本,似乎reduce要快一些,时间以毫秒为单位。

node benchmark.js
reduce 3.5796960592269897
for-loop 16.456849932670593
node -v
v14.19.1
const { performance } = require("perf_hooks");

function benchmark(label, fn) {
  const t0 = performance.now();
  fn();
  const t1 = performance.now();
  console.log(label, t1 - t0);
}

let netArray = Array.from({ length: 100000 }, () => Math.random());
benchmark("reduce", function() {
  netArray.reduce((sum, arr) => sum + arr, 0);
});
benchmark("for-loop", function() {
  let AveragePL = 0;
  for (let index in netArray) {
    AveragePL = AveragePL + netArray[index];
  }
});
hsgswve4

hsgswve44#

.reduce()比循环快得多,如果可以的话,reduce总是比循环更好。下面是一个1,000个元素的数组的测试,重复10,000次:

const netArray = Array.from(Array(1000).keys());

let start = new Date();
let sumReduce;
for(let i = 0; i < 10000; i++) {
  sumReduce = netArray.reduce((sum,arr) => sum + arr, 0);
}
let timeReduce = new Date() - start;

start = new Date();
let sumLoop;
for(let i = 0; i < 10000; i++) {
  sumLoop = 0;
  for(let index in netArray) {
    sumLoop += netArray[index];
  }
}
let timeLoop = new Date() - start;

console.log({
  sumReduce: sumReduce,
  timeReduce: timeReduce,
  sumLoop: sumLoop,
  timeLoop: timeLoop
});

输出:

{
  "sumReduce": 499500,
  "timeReduce": 77,
  "sumLoop": 499500,
  "timeLoop": 971
}

时间单位为毫秒。

相关问题