1 /* ************************************************************************
3 qooxdoo - the new era of web development
8 2004-2007 1&1 Internet AG, Germany, http://www.1and1.org
11 LGPL: http://www.gnu.org/licenses/lgpl.html
12 EPL: http://www.eclipse.org/org/documents/epl-v10.php
13 See the LICENSE file in the project's top-level directory for details.
16 * Sebastian Werner (wpbasti)
17 * Andreas Ecker (ecker)
19 ************************************************************************ */
21 /* ************************************************************************
24 #embed(qx.icontheme/16/actions/dialog-ok.png)
26 ************************************************************************ */
28 qx.OO.defineClass("qx.dev.TimeTracker", qx.core.Object,
31 qx.core.Object.call(this);
33 this._functions = qx.lang.Array.fromArguments(arguments);
38 qx.dev.TimeTracker.compare = function(a, b) {
48 ---------------------------------------------------------------------------
50 ---------------------------------------------------------------------------
53 qx.Proto.buttonSets = function()
55 var btnLayout = new qx.ui.layout.HorizontalBoxLayout;
57 btnLayout.setLocation(20, 48);
58 btnLayout.setSpacing(5);
60 var loopLabel = new qx.ui.basic.Atom("Method Loops: ");
61 loopLabel.setAllowStretchY(false);
62 loopLabel.setVerticalAlign("middle");
64 var loopInput = new qx.ui.form.TextField("100");
65 loopInput.setAllowStretchY(false);
66 loopInput.setWidth(50);
67 loopInput.setVerticalAlign("middle");
69 var repeatLabel = new qx.ui.basic.Atom("Repeat Number: ");
70 repeatLabel.setAllowStretchY(false);
71 repeatLabel.setVerticalAlign("middle");
72 repeatLabel.setMarginLeft(30);
74 var btnStart1 = new qx.ui.form.Button("Start 3x", "icon/16/actions/dialog-ok.png");
75 var btnStart2 = new qx.ui.form.Button("Start 7x", "icon/16/actions/dialog-ok.png");
76 var btnStart3 = new qx.ui.form.Button("Start 15x", "icon/16/actions/dialog-ok.png");
77 var btnStart4 = new qx.ui.form.Button("Start 25x", "icon/16/actions/dialog-ok.png");
79 btnStart1.addEventListener("execute", function() { this.start(3, parseInt(loopInput.getValue())); }, this);
80 btnStart2.addEventListener("execute", function() { this.start(7, parseInt(loopInput.getValue())); }, this);
81 btnStart3.addEventListener("execute", function() { this.start(15, parseInt(loopInput.getValue())); }, this);
82 btnStart4.addEventListener("execute", function() { this.start(25, parseInt(loopInput.getValue())); }, this);
84 var htmlOutput = this._output = new qx.ui.embed.HtmlEmbed();
86 htmlOutput.setHtml("");
87 htmlOutput.setLocation(20, 78);
88 htmlOutput.setRight(335);
89 htmlOutput.setBottom(48);
90 htmlOutput.setBorder("1px solid black");
91 htmlOutput.setBackgroundColor("white");
92 htmlOutput.setPadding(10);
93 htmlOutput.setOverflow("auto");
94 htmlOutput.addToDocument();
96 btnLayout.add(loopLabel, loopInput, repeatLabel, btnStart1, btnStart2, btnStart3, btnStart4);
97 btnLayout.addToDocument();
100 qx.Proto.start = function(vRounds, vLoops)
102 var vFuncs = this._functions;
103 var vLength = vFuncs.length;
107 var vHtmlMeasured = [];
108 var vHtmlResults = [];
109 var vCellWidth = Math.round(100 / (vLength+1)) + "%";
111 vHtmlMeasured.push("<h3>Measured Values</h3>");
113 vHtmlMeasured.push("<style type='text/css'>.output{border: 1px solid black; width:100%; margin-bottom: 20px } .output thead{ font-weight: bold; } .output td, .output th{ text-align:left; width: " + vCellWidth + "; } .output td{padding:4px}</style>");
115 vHtmlMeasured.push("<table class='output'>");
117 vHtmlMeasured.push("<thead>");
119 vHtmlMeasured.push("<tr><td> </td>");
121 for (var j=0; j<vLength; j++) {
122 vHtmlMeasured.push("<td>Method " + (j+1) + "</td>");
125 vHtmlMeasured.push("</thead><tbody>");
127 for (var i=0; i<vRounds; i++)
131 for (var j=0; j<vLength; j++)
133 vStart = (new Date).valueOf();
137 vLocalTimes.push((new Date).valueOf()-vStart);
140 vHtmlMeasured.push("<tr><th>Round " + i + "</th>");
142 for (var j=0; j<vLocalTimes.length; j++) {
143 vHtmlMeasured.push("<td>" + vLocalTimes[j] + "</td>");
146 vHtmlMeasured.push("</tr>");
147 vAllTimes.push(vLocalTimes);
150 vHtmlMeasured.push("</tbody></table>");
156 var vSum, vMeanValue, vMeanAll=[], vMeanMin=1e7, vMeanMax=0;
158 for (var j=0; j<vLength; j++)
162 for (var i=0; i<vRounds; i++)
164 vSum += vAllTimes[i][j];
167 vMeanValue = Math.round(vSum / vRounds);
169 vMeanAll.push(vMeanValue);
171 vMeanMin = Math.min(vMeanMin, vMeanValue);
172 vMeanMax = Math.max(vMeanMax, vMeanValue);
177 var vMedian, vMedianValue, vMedianAll=[], vMedianMin=1e7, vMedianMax=0;
179 for (var j=0; j<vLength; j++)
183 for (var i=0; i<vRounds; i++)
185 vMedian.push(vAllTimes[i][j]);
188 vMedian.sort(qx.dev.TimeTracker.compare);
189 vMedianValue = vMedian[Math.floor(vRounds / 2)].toString();
191 vMedianAll.push(vMedianValue);
193 vMedianMin = Math.min(vMedianValue, vMedianMin);
194 vMedianMax = Math.max(vMedianValue, vMedianMax);
201 vHtmlResults.push("<h3>Results Summary</h3>");
203 vHtmlResults.push("<table class='output'>");
205 vHtmlResults.push("<thead>");
207 vHtmlResults.push("<tr><td> </td>");
209 for (var j=0; j<vLength; j++) {
210 vHtmlResults.push("<td>Method " + (j+1) + "</td>");
213 vHtmlResults.push("</thead><tbody>");
216 vHtmlResults.push("<tr>");
218 vHtmlResults.push("<th>Median</th>");
220 for (var j=0; j<vLength; j++) {
221 vHtmlResults.push("<td>" + vMedianAll[j] + "</td>");
224 vHtmlResults.push("</tr>");
228 vHtmlResults.push("<tr>");
230 vHtmlResults.push("<th>Median Factor</th>");
232 for (var j=0; j<vLength; j++)
234 vHtmlResults.push("<td>");
235 vHtmlResults.push(vMedianMin > 0 ? Math.round(vMedianAll[j] / vMedianMin) : "1");
236 vHtmlResults.push("x</td>");
239 vHtmlResults.push("</tr>");
243 vHtmlResults.push("<tr>");
245 vHtmlResults.push("<th>Mean</th>");
247 for (var j=0; j<vLength; j++) {
248 vHtmlResults.push("<td>" + vMeanAll[j] + "</td>");
251 vHtmlResults.push("</tr>");
255 vHtmlResults.push("<tr>");
257 vHtmlResults.push("<th>Mean Factor</th>");
259 for (var j=0; j<vLength; j++)
261 vHtmlResults.push("<td>");
262 vHtmlResults.push(vMeanMin > 0 ? Math.round(vMeanAll[j] / vMeanMin) : 1);
263 vHtmlResults.push("x</td>");
266 vHtmlResults.push("</tr>");
270 vHtmlResults.push("<tr>");
272 vHtmlResults.push("<th>Winner</th>");
274 for (var j=0; j<vLength; j++)
276 vHtmlResults.push("<td>");
278 if (vMedianMin == vMedianAll[j] && vMeanMin == vMeanAll[j])
280 vHtmlResults.push("BOTH");
283 else if (vMedianMin == vMedianAll[j])
285 vHtmlResults.push("MEDIAN");
288 else if (vMeanMin == vMeanAll[j])
290 vHtmlResults.push("MEAN");
293 vHtmlResults.push("</td>");
296 vHtmlResults.push("</tr>");
298 vHtmlResults.push("</tbody></table>");
300 this._output.setHtml(vHtmlResults.join("") + vHtmlMeasured.join(""));
309 ---------------------------------------------------------------------------
311 ---------------------------------------------------------------------------
314 qx.Proto.dispose = function()
316 if (this.getDisposed()) {
320 this._functions = null;
322 return qx.core.Object.prototype.dispose.call(this);