var minTotalTimeMs = 10 * 1000;
var minIterations = 5;
var warmUpTimeMs = 1000;
var benchmarkStartTime;
var loadStartTimeMs;
var loadingTimesMs = [];
var isDone = false;
var img;
var now = (function() {
if (window.performance)
return (window.performance.now ||
window.performance.webkitNow).bind(window.performance);
return Date.now.bind(window);
})();
getImageFormat = function() {
if (document.location.search) {
return document.location.search.substr(1);
}
return "jpg";
}
prepareImageElement = function() {
img = document.createElement('img');
img.setAttribute('width', '100%');
img.setAttribute('height', '100%');
document.body.appendChild(img);
console.log("Running benchmark for at least " + minTotalTimeMs +
" ms and at least " + minIterations + " times.");
document.getElementById('status').innerHTML = "Benchmark running.";
setStatus(getImageFormat().toUpperCase() + " benchmark running.");
benchmarkStartTimeMs = now();
}
setStatus = function(status) {
document.getElementById('status').innerHTML = status;
}
runBenchmark = function() {
setStatus("Preparing benchmark.");
prepareImageElement();
startLoadingImage();
}
var iteration = (new Date).getTime();
startLoadingImage = function() {
img.style.display = 'none';
img.setAttribute('onload', '');
img.setAttribute('src', '');
img.addEventListener('load', onImageLoaded);
requestAnimationFrame(function() {
loadStartTimeMs = now();
img.setAttribute('src', 'droids.' + getImageFormat() + '?' + iteration);
iteration += 1;
});
}
var requestAnimationFrame = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 60);
};
})().bind(window);
onImageLoaded = function() {
var nowMs = now();
var loadingTimeMs = nowMs - loadStartTimeMs;
if (nowMs - benchmarkStartTimeMs >= warmUpTimeMs) {
loadingTimesMs.push(loadingTimeMs);
}
if (nowMs - benchmarkStartTimeMs < minTotalTimeMs ||
loadingTimesMs.length < minIterations) {
requestAnimationFrame(function() {
img.style.display = '';
requestAnimationFrame(startLoadingImage);
});
} else {
isDone = true;
console.log("loadingTimes: " + loadingTimesMs);
setStatus(getImageFormat().toUpperCase() + " benchmark finished: " +
loadingTimesMs);
}
}
averageLoadingTimeMs = function() {
if (!loadingTimesMs.length)
return 0;
var total = 0;
for (var i = 0; i < loadingTimesMs.length; ++i) {
total += loadingTimesMs[i];
}
return total / loadingTimesMs.length;
}