gecko/testing/tools/pageloader/chrome/content/report.js

113 lines
2.9 KiB
JavaScript
Raw Normal View History

// Constructor
function Report(pages) {
this.pages = pages;
this.timeVals = new Array(pages.length); // matrix of times
for (var i = 0; i < this.timeVals.length; ++i) {
this.timeVals[i] = new Array;
}
}
// returns an object with the following properties:
// min : min value of array elements
// max : max value of array elements
// mean : mean value of array elements
// vari : variance computation
// stdd : standard deviation, sqrt(vari)
// indexOfMax : index of max element (the element that is
// removed from the mean computation)
Report.prototype.getArrayStats = function(ary) {
var r = {};
r.min = ary[0];
r.max = ary[0];
r.indexOfMax = 0;
var sum = 0;
for (var i = 0; i < ary.length; ++i) {
if (ary[i] < r.min) {
r.min = ary[i];
} else if (ary[i] > r.max) {
r.max = ary[i];
r.indexOfMax = i;
}
sum = sum + ary[i];
}
// median
sorted_ary = ary.concat();
sorted_ary.sort();
// remove longest run
sorted_ary.pop();
if (sorted_ary.length%2) {
r.median = sorted_ary[(sorted_ary.length-1)/2];
}else{
var n = Math.floor(sorted_ary.length / 2);
r.median = (sorted_ary[n] + sorted_ary[n + 1]) / 2;
}
// ignore max value when computing mean and stddev
r.mean = (sum - r.max) / (ary.length - 1);
r.vari = 0;
for (var i = 0; i < ary.length; ++i) {
if (i == r.indexOfMax)
continue;
var d = r.mean - ary[i];
r.vari = r.vari + d * d;
}
r.vari = r.vari / (ary.length - 1);
r.stdd = Math.sqrt(r.vari);
return r;
}
Report.prototype.getReport = function() {
var all = new Array();
var counter = 0;
for (var i = 0; i < this.timeVals.length; ++i) {
for (var j = 0; j < this.timeVals[i].length; ++j) {
all[counter] = this.timeVals[i][j];
++counter;
}
}
// avg and avg median are cumulative for all the pages
var avgs = new Array();
var medians = new Array();
for (var i = 0; i < this.timeVals.length; ++i) {
avgs[i] = this.getArrayStats(this.timeVals[i]).mean;
medians[i] = this.getArrayStats(this.timeVals[i]).median;
}
var avg = this.getArrayStats(avgs).mean;
var avgmed = this.getArrayStats(medians).mean;
var r = this.getArrayStats(all);
var report = '';
report +=
"(tinderbox dropping follows)\n"+
"_x_x_mozilla_page_load,"+avgmed+","+r.max+","+r.min+"\n"+
"_x_x_mozilla_page_load_details,avgmedian|"+avgmed+"|average|"+avg.toFixed(2)+"|minimum|"+r.min+"|maximum|"+r.max+"|stddev|"+r.stdd.toFixed(2)+":"
for (var i = 0; i < this.timeVals.length; ++i) {
r = this.getArrayStats(this.timeVals[i]);
report +=
'|'+
i+';'+
pages[i]+';'+
r.median+';'+
r.mean+';'+
r.min+';'+
r.max
for (var j = 0; j < this.timeVals[i].length; ++j) {
report +=
';'+this.timeVals[i][j]
}
}
return report;
}
Report.prototype.recordTime = function(pageIndex, ms) {
this.timeVals[pageIndex].push(ms);
}