tools/performance/pageload/cycler.html

branch
TOR_BUG_9701
changeset 15
b8a032363ba2
equal deleted inserted replaced
-1:000000000000 0:0b7fc3b334e6
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/. -->
4
5 <html>
6 <script>
7 var pages = [
8 "bugzilla.mozilla.org/",
9 "lxr.mozilla.org/",
10 "vanilla-page/"
11 ];
12 var pages_i18n = [];
13
14 var NUM_PAGES;
15 var NUM_CYCLES;
16
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();
42
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;
50
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 }
74
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 }
86
87 // ignore max value when computing mean and stddev
88 r.mean = (sum - r.max) / (ary.length - 1);
89
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 }
97
98 r.vari = r.vari / (ary.length - 1);
99 r.stdd = Math.sqrt(r.vari);
100 return r;
101 }
102
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 }
110
111 function dumpReport() {
112 var all = new Array();
113 var counter = 0;
114
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 }
121
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;
131
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 );
138
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 }
157
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");
163
164 appendTableCol(tr, pages[i]);
165
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));
172
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 }
179
180 tbody.appendChild(tr);
181 }
182 }
183
184 function loadPage(i) {
185 tstart = new Date();
186 frames["content"].document.location = "base/" + pages[i] + "index.html";
187 }
188
189 function frameLoad() {
190 if (cycle == NUM_CYCLES) {
191 showReport();
192 dumpReport();
193 window.close();
194 return;
195 }
196
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('/');
204
205 var text = (cycle + 1) + ', ' + (index + 1) + ', ' + fields[fields.length - 2] + ", " + tdelta;
206
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));
212
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 }
221
222 window.setTimeout("loadPage(" + index + ")", 500);
223 }
224
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