benchmarks = {
rerun;
const targetFrameRate = 1000 / 60;
const makeArr = length => {
const arr = [0];
for (let i = 0; i < length; i++) arr[i] = i;
return arr;
};
async function benchmark(foreach) {
let callback = (_, i, a) => a[i] = i;
let result;
let input;
let length = 1 << 9;
let time = 0;
while (time < 200 && length < (1 << 24)) {
length = length << 1;
input = makeArr(length);
const t0 = performance.now();
result = await foreach(input, callback, targetFrameRate);
time = performance.now() - t0;
}
input = makeArr(length);
if (result) {
result = await foreach(input, callback, targetFrameRate);
const keys = Object.keys(result);
for (let i = 0; i < 9; i++) {
const nresult = await foreach(input, callback, targetFrameRate);
for (const key of keys) {
if (Array.isArray(result[key])) continue;
else result[key] += nresult[key];
}
}
for (const key of keys) {
if (Array.isArray(result[key])) continue;
else result[key] /= 10;
}
return result;
} else {
const runs = [];
time = performance.now();
for (let i = 0; i < 10; i++){
const t0 = performance.now();
await foreach(input, callback, targetFrameRate);
runs[i] = performance.now() - t0;
}
return {length, runs, time: (performance.now() - time) / 10, arr: input, batches: NaN, samples: NaN};
}
}
const fns = [asyncForEachV000, asyncForEachV001, asyncForEachV002, asyncForEachV003, asyncForEachV004, asyncForEachV005, asyncForEachV006, asyncForEachV007, asyncForEach];
const results = {};
fns.map(fn => results[fn.name] = {started: false});
for (const fn of fns) {
results[fn.name].started = true;
yield results;
results[fn.name] = await benchmark(fn);
yield results;
}
}