陣列求和:比較 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 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告