// This file defines helper methods for running performance tests in workers.
(function () {
class WorkerTestHelper {
constructor() {
this.callsPerIteration = 1;
}
// Measure the runs per second of test.run().
// This method should be used together with
// |PerfTestRunner.startMeasureValuesInWorker| in
// src/third_party/blink/perf_tests/resources/runner.js.
//
// Arguments:
// |test.run| is the function to test.
// |test.setup| and |test.tearDown| are optional functions.
// |test.iterationCount| defines count of iterations to run. Default value
// is 5.
//
// Returns a promise that resolves to an object:
// |result.error|: The error string or null if no error occurs.
// |result.values|: An array of test result values. Unit is runs/s.
async measureRunsPerSecond(test) {
return await this.runTestRepeatedly_(test,
this.measureRunsPerSecondOnce_.bind(this));
}
// Measure the elapsed time of test.run().
// This method should be used together with
// |PerfTestRunner.startMeasureValuesInWorker| in
// src/third_party/blink/perf_tests/resources/runner.js.
//
// Refer measureRunsPerSecond() for definition of the arguments.
//
// Returns a promise that resolves to an object:
// |result.error|: The error string or null if no error occurs.
// |result.values|: An array of test result values. Unit is ms.
async measureTime(test) {
return await this.runTestRepeatedly_(test,
this.callRunAndMeasureTime_.bind(this));
}
// Repeatedly run test.run() and measure it.
async runTestRepeatedly_(test, proc) {
this.test = test;
const values = [];
const iterationCount =
this.test.iterationCount ? this.test.iterationCount : 5;
try {
if (this.test.setup)
await this.test.setup();
for (let i = 0; i < iterationCount; i++) {
values.push(await proc());
}
if (this.test.tearDown)
await this.test.tearDown();
} catch (exception) {
const error = "Got an exception while running test with name=" +
exception.name + ", message=" + exception.message + "\n" +
exception.stack;
return { error: error, values: null };
}
return { error: null, values: values };
}
// This method is basically the same with measureRunsPerSecondOnce() in
// src/third_party/blink/perf_tests/resources/runner.js
async measureRunsPerSecondOnce_() {
const timeToRun = 750;
let totalTime = 0;
let numberOfRuns = 0;
while (totalTime < timeToRun) {
totalTime += await this.callRunAndMeasureTime_();
numberOfRuns += this.callsPerIteration;
if (totalTime < 100)
this.callsPerIteration = Math.max(10, 2 * this.callsPerIteration);
}
return numberOfRuns * 1000 / totalTime;
};
async callRunAndMeasureTime_() {
const startTime = performance.now();
for (let i = 0; i < this.callsPerIteration; i++) {
await this.test.run();
}
return performance.now() - startTime;
}
}
self.workerTestHelper = new WorkerTestHelper();
})();