You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.5 KiB
127 lines
3.5 KiB
const REPORT_URL = 'http://localhost:8081/report_perf_data'
|
|
// Set this to enforce that the perf server must be up.
|
|
// Typically used for debugging.
|
|
const fail_on_no_perf = false;
|
|
|
|
function benchmarkAndReport(benchName, setupFn, testFn, teardownFn) {
|
|
try {
|
|
let ctx = {};
|
|
// warmup 3 times (arbitrary choice)
|
|
setupFn(ctx);
|
|
testFn(ctx);
|
|
testFn(ctx);
|
|
testFn(ctx);
|
|
teardownFn(ctx);
|
|
|
|
ctx = {};
|
|
setupFn(ctx);
|
|
let start = Date.now();
|
|
let now = start;
|
|
times = 0;
|
|
// See how many times we can do it in 100ms (arbitrary choice)
|
|
while (now - start < 100) {
|
|
testFn(ctx);
|
|
now = Date.now();
|
|
times++;
|
|
}
|
|
|
|
teardownFn(ctx);
|
|
|
|
// Try to make it go for 2 seconds (arbitrarily chosen)
|
|
// Since the pre-try took 100ms, multiply by 20 to get
|
|
// approximate tries in 2s (unless now - start >> 100 ms)
|
|
let goalTimes = times * 20;
|
|
ctx = {};
|
|
setupFn(ctx);
|
|
times = 0;
|
|
start = Date.now();
|
|
while (times < goalTimes) {
|
|
testFn(ctx);
|
|
times++;
|
|
}
|
|
const end = Date.now();
|
|
teardownFn(ctx);
|
|
|
|
const us = (end - start) * 1000 / times;
|
|
console.log(benchName, `${us} microseconds`)
|
|
return _report(us, benchName);
|
|
} catch(e) {
|
|
console.error('caught error', e);
|
|
return Promise.reject(e);
|
|
}
|
|
}
|
|
|
|
// The same as benchmarkAndReport, except expects the third parameter, testFn, to return a promise
|
|
async function asyncBenchmarkAndReport(benchName, setupFn, testFn, teardownFn) {
|
|
try {
|
|
let ctx = {};
|
|
// warmup 3 times (arbitrary choice)
|
|
setupFn(ctx);
|
|
await testFn(ctx);
|
|
await testFn(ctx);
|
|
await testFn(ctx);
|
|
teardownFn(ctx);
|
|
|
|
ctx = {};
|
|
setupFn(ctx);
|
|
let start = Date.now();
|
|
let now = start;
|
|
times = 0;
|
|
// See how many times we can do it in 100ms (arbitrary choice)
|
|
while (now - start < 100) {
|
|
await testFn(ctx);
|
|
now = Date.now();
|
|
times++;
|
|
}
|
|
|
|
teardownFn(ctx);
|
|
|
|
// Try to make it go for 2 seconds (arbitrarily chosen)
|
|
// Since the pre-try took 100ms, multiply by 20 to get
|
|
// approximate tries in 2s (unless now - start >> 100 ms)
|
|
let goalTimes = times * 20;
|
|
ctx = {};
|
|
setupFn(ctx);
|
|
times = 0;
|
|
start = Date.now();
|
|
while (times < goalTimes) {
|
|
await testFn(ctx);
|
|
times++;
|
|
}
|
|
const end = Date.now();
|
|
teardownFn(ctx);
|
|
|
|
const us = (end - start) * 1000 / times;
|
|
console.log(benchName, `${us} microseconds`)
|
|
return _report(us, benchName);
|
|
} catch(e) {
|
|
console.error('caught error', e);
|
|
return Promise.reject(e);
|
|
}
|
|
}
|
|
|
|
|
|
function _report(microseconds, benchName) {
|
|
return fetch(REPORT_URL, {
|
|
method: 'POST',
|
|
mode: 'no-cors',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
'bench_name': benchName,
|
|
'time_us': microseconds,
|
|
})
|
|
}).then(() => console.log(`Successfully reported ${benchName} to perf aggregator`));
|
|
}
|
|
|
|
function reportError(done) {
|
|
return (e) => {
|
|
console.log("Error with fetching. Likely could not connect to aggegator server", e.message);
|
|
if (fail_on_no_perf) {
|
|
expect(e).toBeUndefined();
|
|
}
|
|
done();
|
|
};
|
|
}
|