|
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> |