最快的JavaScript求和

87
什么是在JavaScript中对数组进行求和的最快方法? 快速搜索可以找到几种不同的方法,但如果可能的话,我想要一个本地解决方案。这将在SpiderMonkey下运行。
从非常内部的角度考虑,我一直在使用:
var count = 0;
for(var i = 0; i < array.length; i++)
{
    count = count + array[i];
}

我相信有比直接迭代更好的方法。


3
测试!如果你想知道做某件事情最快的方法是什么,可以尝试几种方法,并测量结果。 - CaffGeek
4
@Chad:显然,不过我已经没有那种“跳脱传统思维”的日子了。 - Josh K
11个回答

0

这里是一个 jsPerf,包含了 @Ankur 的答案的所有变体和一些小修改:

https://jsben.ch/J6ywV

变更:

  1. 对于数组 [1,2,3,..,n][n,n-1,n-2,..,1] 的求和,性能存在差异。

    标记为 (reversed array) 的测试使用反转的测试数组运行相同的测试函数。它们总是优于其对应项。

  2. console.log(`Sum: ${sum}`) 对测量有负面影响,已被移除(渲染输出需要时间)。

  3. 我添加了 reduceRight() 的基准测试。

enter image description here

为了获得更可靠的结果,您可能需要多次运行每个测试,并使用不同的数组以获得平均运行时间。

// Test functions
let fn_reduce = a => a.reduce((pv, cv) => pv + cv, 0);
let fn_reduceRight = a => a.reduceRight((pv, cv) => pv + cv, 0);
let tests = [fn_reduce, fn_reduceRight];

// Test config
let runs = 8;     // test runs
let length = 100000; // array length
// .. test with "array" and "reversed array"
let arr1 = Array.from({length}, (_, i) => i);
let arr2 = Array.from({length}, (_, i) => length - i - 1);

let out = [];
let outGrouped = {};
for(let i = 0; i < runs; i++){
  tests.forEach(fn => {
    (i % 2 ? [arr1, arr2] : [arr2, arr1]).forEach(arr => {
        let isArrayReverse = arr !== arr1;
        let sum = 0;
        let t1 = performance.now();

        sum = fn(arr);

        let t2 = performance.now();
        let duration = t2 - t1;
        out.push({run: i, fn: fn.name, isArrayReverse, duration});

        let group = `${fn.name}_${isArrayReverse}`;
        outGrouped[group] ??= {fn: fn.name, isArrayReverse, duration: 0, runs: 0};
        outGrouped[group].duration += duration;
        outGrouped[group].runs++;
    });
  });
}

//console.log('out'); // detailed output

console.log('OPEN DEV-TOOLS for console.table()!');
console.log('Sort by "avg" column.');

console.table(Object.fromEntries(Array.from(Object.entries(outGrouped), ([group, {duration, runs, ...rest}]) => [group, {...rest, avg: duration / runs, duration, runs}])));

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接