chromium/tools/page_cycler/common/report.html

<html>
<head>
<style>
.discarded {
  color: #C0C0C0;
}
</style>
<h2>Summary</h2>
<dl>
<script src="head.js"></script>
<script>
var __results = true;
var cycles = 0;
var s = document.location.search.substring(1);
var params = s.split('&');
var iterations, pages, totalTime, fudgeTime;
for (var i = 0; i < params.length; ++i) {
  var f = params[i].split('=');
  switch (f[0]) {
  case 'n':
    iterations = (f[1] - 0);
    break;
  case 'i':
    cycle = (f[1] - 0);
    break;
  case 'td':
    totalTime = (f[1] - 0);
    break;
  case 'tf':
    fudgeTime = (f[1] - 0);
    break;
  }
}
var pages = cycle / iterations;
document.write("<table border=1>");
document.write("<tr><td>iterations</td><td>" + iterations + "</td></tr>");
document.write("<tr><td>pages</td><td>" + pages + "</td></tr>");
document.write("<tr><td>milliseconds</td><td>" + totalTime + "</td></tr>");
document.write("<tr><td>mean per set</td><td>" + (totalTime / iterations).toFixed(2) + "</td></tr>");
document.write("<tr><td>mean per page</td><td>" + (totalTime / iterations / pages).toFixed(2) + "</td></tr>");
document.write("<tr><td>timer lag</td><td>" + (fudgeTime).toFixed(2) + "</td></tr>");
document.write("<tr><td>timer lag per page</td><td>" + (fudgeTime / iterations / pages).toFixed(2) + "</td></tr>");
document.write("</table>");

  // 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)
  function getArrayStats(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];
    }

    // 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);
    r.errp = r.stdd / Math.sqrt((ary.length - 1) / 2) / r.mean * 100;
    return r;
  }

  function appendTableCol(tr, text, linkify) {
    var doc = tr.ownerDocument;
    var td = doc.createElement("TD");
    
    if (linkify) {
      var anchor = doc.createElement("A");
      if (text.indexOf('http://localhost:') == 0 ||
          text.indexOf('file://') == 0) {
        // URLs for page cycler HTTP and file tests.
        anchor.href = text + "/index.html?skip=true";
      } else {
        // For Web Page Replay, URLs are same as recorded pages.
        anchor.href = text;
      }
      anchor.appendChild(doc.createTextNode(text));
      td.appendChild(anchor);
    }
    else 
      td.appendChild(doc.createTextNode(text));
    tr.appendChild(td);
    return td;
  }
  
  function getTimeVals() {
    var rawData = __get_timings().split(",");
    var timeVals = [];
    for (var i = 0; i < iterations; ++i) {
      for (var j = 0; j < pages; ++j) {
        if (!timeVals[j])
          timeVals[j] = [];
        timeVals[j].push(parseInt(rawData[j + i*pages]));
      }
    }
    return timeVals;
  }

  function showReport() {
    var tbody = document.getElementById("tbody");
    var colsums = [0,0,0,0,0];
    var timeVals = getTimeVals();
    for (var i = 0; i < timeVals.length; ++i) {
      var tr = document.createElement("TR");

      appendTableCol(tr, __pages()[i], true);

      var r = getArrayStats(timeVals[i]);
      appendTableCol(tr, r.min.toFixed(2));
      appendTableCol(tr, r.max.toFixed(2));
      appendTableCol(tr, r.mean.toFixed(2));
      appendTableCol(tr, r.stdd.toFixed(2));
      appendTableCol(tr, r.errp.toFixed(2));
      //appendTableCol(tr, r.chi2.toFixed(2));

      for (var j = 0; j < timeVals[i].length; ++j) {
        var tv = timeVals[i][j];
        var td = appendTableCol(tr, tv);
        if (j == r.indexOfMax)
          td.setAttribute("class", "discarded");
      }

      colsums[0] = colsums[0] + r.min;
      colsums[1] = colsums[1] + r.max;
      colsums[2] = colsums[2] + r.mean;
      colsums[3] = colsums[3] + r.stdd;
      colsums[4] = colsums[4] + r.errp;

      tbody.appendChild(tr);
    }

    var tr = document.createElement("TR");
    appendTableCol(tr, "totals:");
    for (var k = 0; k < colsums.length; ++k)
      appendTableCol(tr, colsums[k].toFixed(2));
    tbody.appendChild(tr);
  }
  window.onload = showReport;

</script>
</dl>
</head>
<body>
<h2>Complete Statistics</h2>
<table border="1">
<thead>
<tr>
  <th>Site</th>
  <th>Min</th>
  <th>Max</th>
  <th>Mean</th>
  <th>Std.d</th>
  <th>Err %</th>
  <th colspan="10">Runs</th>
</tr>
</thead>
<tbody id="tbody"></tbody>
</table>
</body>
</html>