function runImageDecoderPerfTests(imageFile, testDescription,
alsoMeasureYUVDecoding = false) {
var isDone = false;
function runTest() {
var image = new Image();
// NB: Because it is part of the Image.Decode() specification to wait for
// all data to be received before attempting a decode (including for frames
// of an animated image), we must remember this metric is only for a single
// ImageDecoder::Decode call (as opposed to progressive decoding).
//
// Therefore, we avoid disc read overhead and put timing as part of
// the onload callback.
image.onload = function() {
PerfTestRunner.addRunTestStartMarker();
var startTime = PerfTestRunner.now();
// Issue a decode command
image.decode().then(function () {
var runTime = PerfTestRunner.now() - startTime;
PerfTestRunner.measureValueAsync(runTime);
PerfTestRunner.addRunTestEndMarker();
// addRunTestEndMarker sets isDone to true once all iterations are
// performed.
if (!isDone) {
// To avoid cache exhasution, ensure each run lasts at least 100ms,
// giving our image cache (which can hold on average 6 of the images
// used in this test) time to evict them.
var minRunTime = 100.0;
setTimeout(runTest, Math.max(0, minRunTime - runTime));
}
}).catch(error => console.log(error.message));
}
// Begin fetching the data
image.src = imageFile + "?" + Math.random();
}
window.onload = function () {
PerfTestRunner.startMeasureValuesAsync({
unit: "ms",
done: function () {
isDone = true;
},
run: function () {
runTest();
},
iterationCount: 20,
description: testDescription,
tracingCategories: 'blink',
traceEventsToMeasure: ['ImageFrameGenerator::decode'].concat(alsoMeasureYUVDecoding ?
['ImageFrameGenerator::decodeToYUV'] : []),
});
};
}