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];
let runs = 8;
let length = 100000;
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('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}])));