数组求和:比较 JavaScript 中的递归、for 循环和 ES6 方法


假设我们有一个包含大量数字条目的数组,需要比较递归、简单循环和 ES6 函数在对数组所有条目求和时所花费的时间,即递归与 for 循环与 ES6 函数的比较。

在这里,为了模拟一个大型数组,我们将对一个相对较小的数组进行大量迭代(约 10000000 次)。我们的主要目标只是粗略地了解每种方法在数组求和中所花费的时间比例。

第一部分:递归方法

const recursiveSum = (arr, len = 0, sum = 0) => {
   if(len < arr.length){
      return recursiveSum(arr, len+1, sum + arr[len]);
   };
   return sum;
};

第二部分:循环方法

const loopingSum = arr => {
   let sum = 0;
   for(let i = 0; i < arr.length; i++){
      sum += arr[i];
   };
   return sum;
};

第三部分:ES6 方法

const ES6Sum = arr => arr.reduce((acc, val) => acc+val);

现在,让我们借助控制台方法 time() 和 timeEnd() 来比较这三个函数的性能:

示例

const ITERATIONS = 100000000;
const arr = [12, 65, 87, 2, 23, 87, 4, 66, 34, 89, 89, 32, 4];
const recursiveSum = (arr, len = 0, sum = 0) => {
   if(len < arr.length){
      return recursiveSum(arr, len+1, sum + arr[len]);
   };
   return sum;
};
const loopingSum = arr => {
   let sum = 0;
   for(let i = 0; i < arr.length; i++){
      sum += arr[i];
   };
   return sum;
};
const ES6Sum = arr => arr.reduce((acc, val) => acc+val);
console.time('recursive approach');
for(let k = 0; k < ITERATIONS; k++){
   recursiveSum(arr);
};
console.timeEnd('recursive approach');
console.time('looping approach');
for(let l = 0; l < ITERATIONS; l++){
   loopingSum(arr);
};
console.timeEnd('looping approach');
console.time('ES6 approach');
for(let m = 0; m < ITERATIONS; m++){
   loopingSum(arr);
};
console.timeEnd('ES6 approach');

现在让我们来看一下可能的控制台输出:

注意 - 这只是一个可能的控制台输出,因为任何代码段的性能都严重依赖于系统。但是,这三种函数所花费的时间比例在所有系统中或多或少都是相同的。

recursive approach: 13.774s
looping approach: 3.138s
ES6 approach: 2.493s

因此,在这里我们可以看到,在一台特定机器上,三种方法在大量迭代中所花费的时间。这表明,对于数组上的较小和基本的计算,ES6 函数比任何其他方法都更有效率和性能更高。

注意 - 为了获得更好的结果,请避免在在线 IDE 中测试此代码。

更新于:2020年8月28日

196 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告