1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/tools/performance/pageload/cycler.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,234 @@ 1.4 +<!-- This Source Code Form is subject to the terms of the Mozilla Public 1.5 + - License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> 1.7 + 1.8 +<html> 1.9 +<script> 1.10 + var pages = [ 1.11 + "bugzilla.mozilla.org/", 1.12 + "lxr.mozilla.org/", 1.13 + "vanilla-page/" 1.14 + ]; 1.15 + var pages_i18n = []; 1.16 + 1.17 + var NUM_PAGES; 1.18 + var NUM_CYCLES; 1.19 + 1.20 + function parseParams() { 1.21 + var s = document.location.search.substring(1); 1.22 + var params = s.split('&'); 1.23 + for (var i = 0; i < params.length; ++i) { 1.24 + var fields = params[i].split('='); 1.25 + switch (fields[0]) { 1.26 + case 'cycles': 1.27 + NUM_CYCLES = (fields[1] - 0); 1.28 + break; 1.29 + case 'pages': 1.30 + NUM_PAGES = (fields[1] - 0); 1.31 + break; 1.32 + case 'i18n': 1.33 + if (fields[1] == '1') { 1.34 + pages = pages.concat(pages_i18n); 1.35 + } 1.36 + break; 1.37 + } 1.38 + } 1.39 + if (!NUM_PAGES) 1.40 + NUM_PAGES = pages.length; 1.41 + if (!NUM_CYCLES) 1.42 + NUM_CYCLES = 5; 1.43 + } 1.44 + parseParams(); 1.45 + 1.46 + var timeVals = new Array(NUM_PAGES); // matrix of times 1.47 + for (var i = 0; i < timeVals.length; ++i) { 1.48 + timeVals[i] = new Array; 1.49 + } 1.50 + var tstart; 1.51 + var index = 0; 1.52 + var cycle = 0; 1.53 + 1.54 + // returns an object with the following properties: 1.55 + // min : min value of array elements 1.56 + // max : max value of array elements 1.57 + // mean : mean value of array elements 1.58 + // vari : variance computation 1.59 + // stdd : standard deviation, sqrt(vari) 1.60 + // indexOfMax : index of max element (the element that is 1.61 + // removed from the mean computation) 1.62 + function getArrayStats(ary) { 1.63 + var r = {}; 1.64 + r.min = ary[0]; 1.65 + r.max = ary[0]; 1.66 + r.indexOfMax = 0; 1.67 + var sum = 0; 1.68 + for (var i = 0; i < ary.length; ++i) { 1.69 + if (ary[i] < r.min) { 1.70 + r.min = ary[i]; 1.71 + } else if (ary[i] > r.max) { 1.72 + r.max = ary[i]; 1.73 + r.indexOfMax = i; 1.74 + } 1.75 + sum = sum + ary[i]; 1.76 + } 1.77 + 1.78 + // median 1.79 + sorted_ary = ary.concat(); 1.80 + sorted_ary.sort(); 1.81 + // remove longest run 1.82 + sorted_ary.pop(); 1.83 + if (sorted_ary.length%2) { 1.84 + r.median = sorted_ary[(sorted_ary.length-1)/2]; 1.85 + }else{ 1.86 + var n = Math.floor(sorted_ary.length / 2); 1.87 + r.median = (sorted_ary[n] + sorted_ary[n + 1]) / 2; 1.88 + } 1.89 + 1.90 + // ignore max value when computing mean and stddev 1.91 + r.mean = (sum - r.max) / (ary.length - 1); 1.92 + 1.93 + r.vari = 0; 1.94 + for (var i = 0; i < ary.length; ++i) { 1.95 + if (i == r.indexOfMax) 1.96 + continue; 1.97 + var d = r.mean - ary[i]; 1.98 + r.vari = r.vari + d * d; 1.99 + } 1.100 + 1.101 + r.vari = r.vari / (ary.length - 1); 1.102 + r.stdd = Math.sqrt(r.vari); 1.103 + return r; 1.104 + } 1.105 + 1.106 + function appendTableCol(tr, text) { 1.107 + var doc = tr.ownerDocument; 1.108 + var td = doc.createElement("TD"); 1.109 + td.appendChild(doc.createTextNode(text)); 1.110 + tr.appendChild(td); 1.111 + return td; 1.112 + } 1.113 + 1.114 + function dumpReport() { 1.115 + var all = new Array(); 1.116 + var counter = 0; 1.117 + 1.118 + for (var i = 0; i < timeVals.length; ++i) { 1.119 + for (var j = 0; j < timeVals[i].length; ++j) { 1.120 + all[counter] = timeVals[i][j]; 1.121 + ++counter; 1.122 + } 1.123 + } 1.124 + 1.125 + // avg and avg median are cumulative for all the pages 1.126 + var avgs = new Array(); 1.127 + var medians = new Array(); 1.128 + for (var i = 0; i < timeVals.length; ++i) { 1.129 + avgs[i] = getArrayStats(timeVals[i]).mean; 1.130 + medians[i] = getArrayStats(timeVals[i]).median; 1.131 + } 1.132 + var avg = getArrayStats(avgs).mean; 1.133 + var avgmed = getArrayStats(medians).mean; 1.134 + 1.135 + var r = getArrayStats(all); 1.136 + dump( 1.137 + "(tinderbox dropping follows)\n"+ 1.138 + "_x_x_mozilla_page_load,"+avgmed+","+r.max+","+r.min+"\n"+ 1.139 + "_x_x_mozilla_page_load_details,avgmedian|"+avgmed+"|average|"+avg.toFixed(2)+"|minimum|"+r.min+"|maximum|"+r.max+"|stddev|"+r.stdd.toFixed(2)+":" 1.140 + ); 1.141 + 1.142 + for (var i = 0; i < timeVals.length; ++i) { 1.143 + r = getArrayStats(timeVals[i]); 1.144 + dump( 1.145 + '|'+ 1.146 + i+';'+ 1.147 + pages[i]+';'+ 1.148 + r.median+';'+ 1.149 + r.mean+';'+ 1.150 + r.min+';'+ 1.151 + r.max 1.152 + ); 1.153 + for (var j = 0; j < timeVals[i].length; ++j) { 1.154 + dump( 1.155 + ';'+timeVals[i][j] 1.156 + ); 1.157 + } 1.158 + } 1.159 + } 1.160 + 1.161 + function showReport() { 1.162 + var doc = frames["content"].document; 1.163 + var tbody = doc.getElementById("tbody"); 1.164 + for (var i = 0; i < timeVals.length; ++i) { 1.165 + var tr = doc.createElement("TR"); 1.166 + 1.167 + appendTableCol(tr, pages[i]); 1.168 + 1.169 + var r = getArrayStats(timeVals[i]); 1.170 + appendTableCol(tr, r.min.toFixed(2)); 1.171 + appendTableCol(tr, r.max.toFixed(2)); 1.172 + appendTableCol(tr, r.mean.toFixed(2)); 1.173 + appendTableCol(tr, r.stdd.toFixed(2)); 1.174 + appendTableCol(tr, r.median.toFixed(2)); 1.175 + 1.176 + for (var j = 0; j < timeVals[i].length; ++j) { 1.177 + var tv = timeVals[i][j]; 1.178 + var td = appendTableCol(tr, tv); 1.179 + if (j == r.indexOfMax) 1.180 + td.setAttribute("class", "discarded"); 1.181 + } 1.182 + 1.183 + tbody.appendChild(tr); 1.184 + } 1.185 + } 1.186 + 1.187 + function loadPage(i) { 1.188 + tstart = new Date(); 1.189 + frames["content"].document.location = "base/" + pages[i] + "index.html"; 1.190 + } 1.191 + 1.192 + function frameLoad() { 1.193 + if (cycle == NUM_CYCLES) { 1.194 + showReport(); 1.195 + dumpReport(); 1.196 + window.close(); 1.197 + return; 1.198 + } 1.199 + 1.200 + var tend = new Date(); 1.201 + var href = frames["content"].document.location.href; 1.202 + if (href == "about:blank") 1.203 + return; 1.204 + var tdelta = tend - tstart; 1.205 + timeVals[index].push(tdelta); 1.206 + var fields = href.split('/'); 1.207 + 1.208 + var text = (cycle + 1) + ', ' + (index + 1) + ', ' + fields[fields.length - 2] + ", " + tdelta; 1.209 + 1.210 + var doc = frames["header"].document; 1.211 + var body = doc.body; 1.212 + while (body.firstChild) 1.213 + body.removeChild(body.firstChild); 1.214 + body.appendChild(doc.createTextNode(text)); 1.215 + 1.216 + if (++index == NUM_PAGES) { 1.217 + index = 0; 1.218 + if (++cycle == NUM_CYCLES) { 1.219 + // display summary 1.220 + frames["content"].document.location = "report.html"; 1.221 + return; 1.222 + } 1.223 + } 1.224 + 1.225 + window.setTimeout("loadPage(" + index + ")", 500); 1.226 + } 1.227 + 1.228 + function init() { 1.229 + window.resizeTo(800, 800); 1.230 + window.setTimeout("loadPage(" + index + ")", 500); 1.231 + } 1.232 +</script> 1.233 +<frameset rows="40,*" onload="init()"> 1.234 + <frame name="header" src="header.html"> 1.235 + <frame name="content" src="" onload="frameLoad()"> 1.236 +</frameset> 1.237 +</html>