tools/performance/pageload/cycler.html

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 <!-- This Source Code Form is subject to the terms of the Mozilla Public
     2    - License, v. 2.0. If a copy of the MPL was not distributed with this
     3    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
     5 <html>
     6 <script>
     7   var pages = [
     8     "bugzilla.mozilla.org/",
     9     "lxr.mozilla.org/",
    10     "vanilla-page/"
    11   ];
    12   var pages_i18n = [];
    14   var NUM_PAGES;
    15   var NUM_CYCLES;
    17   function parseParams() {
    18     var s = document.location.search.substring(1);
    19     var params = s.split('&');
    20     for (var i = 0; i < params.length; ++i) {
    21       var fields = params[i].split('=');
    22       switch (fields[0]) {
    23       case 'cycles':
    24         NUM_CYCLES = (fields[1] - 0);
    25         break;
    26       case 'pages':
    27         NUM_PAGES = (fields[1] - 0);
    28         break;
    29       case 'i18n':
    30         if (fields[1] == '1') {
    31           pages = pages.concat(pages_i18n);
    32         }
    33         break;
    34       }
    35     }
    36     if (!NUM_PAGES)
    37       NUM_PAGES = pages.length;
    38     if (!NUM_CYCLES)
    39       NUM_CYCLES = 5;
    40   }
    41   parseParams();
    43   var timeVals = new Array(NUM_PAGES);  // matrix of times
    44   for (var i = 0; i < timeVals.length; ++i) {
    45     timeVals[i] = new Array;
    46   }
    47   var tstart;
    48   var index = 0;
    49   var cycle = 0;
    51   // returns an object with the following properties:
    52   //   min  : min value of array elements
    53   //   max  : max value of array elements
    54   //   mean : mean value of array elements
    55   //   vari : variance computation
    56   //   stdd : standard deviation, sqrt(vari)
    57   //   indexOfMax : index of max element (the element that is
    58   //                removed from the mean computation)
    59   function getArrayStats(ary) {
    60     var r = {};
    61     r.min = ary[0];
    62     r.max = ary[0];
    63     r.indexOfMax = 0;
    64     var sum = 0;
    65     for (var i = 0; i < ary.length; ++i) {
    66       if (ary[i] < r.min) {
    67         r.min = ary[i];
    68       } else if (ary[i] > r.max) {
    69         r.max = ary[i];
    70         r.indexOfMax = i;
    71       }
    72       sum = sum + ary[i];
    73     }
    75     // median
    76     sorted_ary = ary.concat();
    77     sorted_ary.sort();
    78     // remove longest run
    79     sorted_ary.pop();
    80     if (sorted_ary.length%2) {
    81       r.median = sorted_ary[(sorted_ary.length-1)/2]; 
    82     }else{
    83       var n = Math.floor(sorted_ary.length / 2);
    84       r.median = (sorted_ary[n] + sorted_ary[n + 1]) / 2;
    85     }
    87     // ignore max value when computing mean and stddev
    88     r.mean = (sum - r.max) / (ary.length - 1);
    90     r.vari = 0;
    91     for (var i = 0; i < ary.length; ++i) {
    92       if (i == r.indexOfMax)
    93         continue;
    94       var d = r.mean - ary[i];
    95       r.vari = r.vari + d * d;
    96     }
    98     r.vari = r.vari / (ary.length - 1);
    99     r.stdd = Math.sqrt(r.vari);
   100     return r;
   101   }
   103   function appendTableCol(tr, text) {
   104     var doc = tr.ownerDocument;
   105     var td = doc.createElement("TD");
   106     td.appendChild(doc.createTextNode(text));
   107     tr.appendChild(td);
   108     return td;
   109   }
   111   function dumpReport() {
   112     var all = new Array();
   113     var counter = 0;
   115     for (var i = 0; i < timeVals.length; ++i) {
   116       for (var j = 0; j < timeVals[i].length; ++j) {
   117         all[counter] = timeVals[i][j];
   118         ++counter;
   119       }
   120     }
   122     // avg and avg median are cumulative for all the pages
   123     var avgs = new Array();
   124     var medians = new Array();
   125     for (var i = 0; i < timeVals.length; ++i) {
   126        avgs[i] = getArrayStats(timeVals[i]).mean;
   127        medians[i] = getArrayStats(timeVals[i]).median;
   128     }
   129     var avg = getArrayStats(avgs).mean;
   130     var avgmed = getArrayStats(medians).mean;
   132     var r = getArrayStats(all);
   133     dump(
   134       "(tinderbox dropping follows)\n"+
   135       "_x_x_mozilla_page_load,"+avgmed+","+r.max+","+r.min+"\n"+
   136       "_x_x_mozilla_page_load_details,avgmedian|"+avgmed+"|average|"+avg.toFixed(2)+"|minimum|"+r.min+"|maximum|"+r.max+"|stddev|"+r.stdd.toFixed(2)+":"
   137     );
   139     for (var i = 0; i < timeVals.length; ++i) {
   140       r = getArrayStats(timeVals[i]);
   141       dump(
   142         '|'+
   143         i+';'+
   144         pages[i]+';'+
   145         r.median+';'+
   146         r.mean+';'+
   147         r.min+';'+
   148         r.max
   149       );
   150       for (var j = 0; j < timeVals[i].length; ++j) {
   151         dump(
   152           ';'+timeVals[i][j]
   153         );
   154       }
   155     } 
   156   }
   158   function showReport() {
   159     var doc = frames["content"].document;
   160     var tbody = doc.getElementById("tbody");
   161     for (var i = 0; i < timeVals.length; ++i) {
   162       var tr = doc.createElement("TR");
   164       appendTableCol(tr, pages[i]);
   166       var r = getArrayStats(timeVals[i]);
   167       appendTableCol(tr, r.min.toFixed(2));
   168       appendTableCol(tr, r.max.toFixed(2));
   169       appendTableCol(tr, r.mean.toFixed(2));
   170       appendTableCol(tr, r.stdd.toFixed(2));
   171       appendTableCol(tr, r.median.toFixed(2));
   173       for (var j = 0; j < timeVals[i].length; ++j) {
   174         var tv = timeVals[i][j];
   175         var td = appendTableCol(tr, tv);
   176         if (j == r.indexOfMax)
   177           td.setAttribute("class", "discarded");
   178       }
   180       tbody.appendChild(tr);
   181     }
   182   }
   184   function loadPage(i) {
   185     tstart = new Date();
   186     frames["content"].document.location = "base/" + pages[i] + "index.html";
   187   }
   189   function frameLoad() {
   190     if (cycle == NUM_CYCLES) {
   191       showReport();
   192       dumpReport();
   193       window.close();
   194       return;
   195     }
   197     var tend = new Date();
   198     var href = frames["content"].document.location.href;
   199     if (href == "about:blank")
   200       return;
   201     var tdelta = tend - tstart;
   202     timeVals[index].push(tdelta);
   203     var fields = href.split('/');
   205     var text = (cycle + 1) + ', ' + (index + 1) + ', ' + fields[fields.length - 2] + ", " + tdelta;
   207     var doc = frames["header"].document;
   208     var body = doc.body;
   209     while (body.firstChild)
   210       body.removeChild(body.firstChild);
   211     body.appendChild(doc.createTextNode(text));
   213     if (++index == NUM_PAGES) {
   214       index = 0;
   215       if (++cycle == NUM_CYCLES) {
   216         // display summary
   217         frames["content"].document.location = "report.html";
   218         return;
   219       }
   220     }
   222     window.setTimeout("loadPage(" + index + ")", 500);
   223   }
   225   function init() {
   226     window.resizeTo(800, 800);
   227     window.setTimeout("loadPage(" + index + ")", 500);
   228   }
   229 </script>
   230 <frameset rows="40,*" onload="init()">
   231   <frame name="header" src="header.html">
   232   <frame name="content" src="" onload="frameLoad()">
   233 </frameset>
   234 </html>

mercurial