Fastest JavaScript summation

前端 未结 10 2140
再見小時候
再見小時候 2020-11-27 15:13

What is the fastest way to sum up an array in JavaScript? A quick search turns over a few different methods, but I would like a native solution if possible. This will run un

10条回答
  •  再見小時候
    2020-11-27 15:26

    I tried using performance.now() to analyze the performance of the different types of loops. I took a very large array and found the sum of all elements of the array. I ran the code three times every time and found forEach and reduce to be a clear winner.

    // For loop

    let arr = [...Array(100000).keys()]
    function addUsingForLoop(ar){
      let sum = 0;
      for(let i = 0; i < ar.length; i++){
        sum += ar[i];
      }
       console.log(`Sum: ${sum}`);
       return sum;
    }
    let t1 = performance.now();
    addUsingForLoop(arr);
    let t2 = performance.now();
    console.log(`Time Taken ~ ${(t2 - t1)} milliseconds`)
    
    // "Sum: 4999950000"
    // "Time Taken ~ 42.17500000959262 milliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 44.41999999107793 milliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 49.845000030472875 milliseconds"
    

    // While loop

    let arr = [...Array(100000).keys()]
    function addUsingWhileLoop(ar){
    let sum = 0;
    let index = 0;
    while (index < ar.length) {
      sum += ar[index];
      index++;
    }
      console.log(`Sum: ${sum}`)
      return sum;
    }
    let t1 = performance.now();
    addUsingWhileLoop(arr);
    let t2 = performance.now();
    console.log(`Time Taken ~ ${(t2 - t1)} milliseconds`)
    
    // "Sum: 4999950000"
    // "Time Taken ~ 44.2499999771826 milliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 44.01999997207895 milliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 41.71000001952052 milliseconds"
    

    // do-while

    let arr = [...Array(100000).keys()]
    function addUsingDoWhileLoop(ar){
    let sum = 0;
    let index = 0;
    do {
       sum += index;
       index++;
    } while (index < ar.length);
       console.log(`Sum: ${sum}`);
       return sum;
    }
    let t1 = performance.now();
    addUsingDoWhileLoop(arr);
    let t2 = performance.now();
    console.log(`Time Taken ~ ${(t2 - t1)} milliseconds`)
    
    // "Sum: 4999950000"
    // "Time Taken ~ 43.79500000504777 milliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 43.47500001313165 milliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 47.535000019706786 milliseconds"
    

    // Reverse loop

    let arr = [...Array(100000).keys()]
    function addUsingReverseLoop(ar){
       var sum=0;
       for (var i=ar.length; i--;) {
         sum+=arr[i];
       }
       console.log(`Sum: ${sum}`);
       return sum;
    }
    let t1 = performance.now();
    addUsingReverseLoop(arr);
    let t2 = performance.now();
    console.log(`Time Taken ~ ${(t2 - t1)} milliseconds`)
    
    // "Sum: 4999950000"
    // "Time Taken ~ 46.199999982491136 milliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 44.96500000823289 milliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 43.880000011995435 milliseconds"
    

    // Reverse while loop

    let arr = [...Array(100000).keys()]
    function addUsingReverseWhileLoop(ar){
        var sum = 0;
        var i = ar.length; 
        while (i--) {
            sum += ar[i];
        }
        console.log(`Sum: ${sum}`);
        return sum;
    }
    var t1 = performance.now();
    addUsingReverseWhileLoop(arr);
    var t2 = performance.now();
    console.log(`Time Taken ~ ${(t2 - t1)} milliseconds`)
    
    // "Sum: 4999950000"
    // "Time Taken ~ 46.26999999163672 milliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 42.97000000951812 milliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 44.31500000646338 milliseconds"
    

    // reduce

    let arr = [...Array(100000).keys()]
    let t1 = performance.now();
    sum = arr.reduce((pv, cv) => pv + cv, 0);
    console.log(`Sum: ${sum}`)
    let t2 = performance.now();
    console.log(`Time Taken ~ ${(t2 - t1)} milliseconds`)
    
    // "Sum: 4999950000"
    // "Time Taken ~ 4.654999997001141 milliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 5.040000018198043 milliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 4.835000028833747 milliseconds"
    

    // forEach

    let arr = [...Array(100000).keys()]
    function addUsingForEach(ar){
      let sum = 0;
      ar.forEach(item => {
        sum += item;
      })
        console.log(`Sum: ${sum}`);
        return sum
    }
    let t1 = performance.now();
    addUsingForEach(arr)
    let t2 = performance.now();
    console.log(`Time Taken ~ ${(t2 - t1)} milliseconds`)
    
    // "Sum: 4999950000"
    // "Time Taken ~ 5.315000016707927 milliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 5.869999993592501 mienter code herelliseconds"
    // "Sum: 4999950000"
    // "Time Taken ~ 5.405000003520399 milliseconds"
    

提交回复
热议问题