2 * Copyright (C) 2007 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 var count = output.length;
29 itemTotals.length = count;
32 var categoryTotals = {};
33 var testTotalsByCategory = {};
36 var categoryMeans = {};
37 var testMeansByCategory = {};
40 var categoryStdDevs = {};
41 var testStdDevsByCategory = {};
44 var categoryStdErrs = {};
45 var testStdErrsByCategory = {};
49 itemTotals = {total: []};
51 for (var i = 0; i < categories.length; i++) {
52 var category = categories[i];
53 itemTotals[category] = [];
54 categoryTotals[category] = 0;
55 testTotalsByCategory[category] = {};
56 categoryMeans[category] = 0;
57 testMeansByCategory[category] = {};
58 categoryStdDevs[category] = 0;
59 testStdDevsByCategory[category] = {};
60 categoryStdErrs[category] = 0;
61 testStdErrsByCategory[category] = {};
64 for (var i = 0; i < tests.length; i++) {
66 itemTotals[test] = [];
67 var category = test.replace(/-.*/, "");
68 testTotalsByCategory[category][test] = 0;
69 testMeansByCategory[category][test] = 0;
70 testStdDevsByCategory[category][test] = 0;
71 testStdErrsByCategory[category][test] = 0;
74 for (var i = 0; i < count; i++) {
75 itemTotals["total"][i] = 0;
76 for (var category in categoryTotals) {
77 itemTotals[category][i] = 0;
78 for (var test in testTotalsByCategory[category]) {
79 itemTotals[test][i] = 0;
85 function computeItemTotals()
87 for (var i = 0; i < output.length; i++) {
88 var result = output[i];
89 for (var test in result) {
90 var time = result[test];
91 var category = test.replace(/-.*/, "");
92 itemTotals["total"][i] += time;
93 itemTotals[category][i] += time;
94 itemTotals[test][i] += time;
99 function computeTotals()
101 for (var i = 0; i < output.length; i++) {
102 var result = output[i];
103 for (var test in result) {
104 var time = result[test];
105 var category = test.replace(/-.*/, "");
107 categoryTotals[category] += time;
108 testTotalsByCategory[category][test] += time;
113 function computeMeans()
115 mean = total / count;
116 for (var category in categoryTotals) {
117 categoryMeans[category] = categoryTotals[category] / count;
118 for (var test in testTotalsByCategory[category]) {
119 testMeansByCategory[category][test] = testTotalsByCategory[category][test] / count;
124 function standardDeviation(mean, items)
126 var deltaSquaredSum = 0;
127 for (var i = 0; i < items.length; i++) {
128 var delta = items[i] - mean;
129 deltaSquaredSum += delta * delta;
131 variance = deltaSquaredSum / items.length;
132 return Math.sqrt(variance);
135 function computeStdDevs()
137 stdDev = standardDeviation(mean, itemTotals["total"]);
138 for (var category in categoryStdDevs) {
139 categoryStdDevs[category] = standardDeviation(categoryMeans[category], itemTotals[category]);
141 for (var category in categoryStdDevs) {
142 for (var test in testStdDevsByCategory[category]) {
143 testStdDevsByCategory[category][test] = standardDeviation(testMeansByCategory[category][test], itemTotals[test]);
148 function computeStdErrors()
150 var sqrtCount = Math.sqrt(count);
152 stdErr = stdDev / sqrtCount;
153 for (var category in categoryStdErrs) {
154 categoryStdErrs[category] = categoryStdDevs[category] / sqrtCount;
156 for (var category in categoryStdDevs) {
157 for (var test in testStdErrsByCategory[category]) {
158 testStdErrsByCategory[category][test] = testStdDevsByCategory[category][test] / sqrtCount;
164 function formatResult(meanWidth, mean, stdErr)
166 var meanString = mean.toFixed(1).toString();
167 while (meanString.length < meanWidth) {
168 meanString = " " + meanString;
171 return meanString + "ms " + "[ +/- " + (1.96 * stdErr).toFixed(2) + "ms | +/- " + ((1.96 * stdErr / mean) * 100).toFixed(2) + "% ]";
174 function computeLabelWidth()
176 var width = "Total".length;
177 for (var category in categoryMeans) {
178 if (category.length + 2 > width)
179 width = category.length + 2;
181 for (var i = 0; i < tests.length; i++) {
182 var shortName = tests[i].replace(/^[^-]*-/, "");
183 if (shortName.length + 4 > width)
184 width = shortName.length + 4;
190 function computeMeanWidth()
192 var width = mean.toFixed(1).toString().length;
193 for (var category in categoryMeans) {
194 var candidate = categoryMeans[category].toFixed(2).toString().length;
195 if (candidate > width)
197 for (var test in testMeansByCategory[category]) {
198 var candidate = testMeansByCategory[category][test].toFixed(2).toString().length;
199 if (candidate > width)
207 function resultLine(labelWidth, indent, label, meanWidth, mean, stdErr)
210 for (i = 0; i < indent; i++) {
214 result += label + ": ";
216 for (i = 0; i < (labelWidth - (label.length + indent)); i++) {
220 return result + formatResult(meanWidth, mean, stdErr);
223 function printOutput()
225 var labelWidth = computeLabelWidth();
226 var meanWidth = computeMeanWidth();
229 print("========================================");
230 print("RESULTS (means and 95% confidence intervals)");
231 print("----------------------------------------");
232 print(resultLine(labelWidth, 0, "Total", meanWidth, mean, stdErr));
233 print("----------------------------------------");
234 for (var category in categoryMeans) {
235 print(resultLine(labelWidth, 2, category, meanWidth, categoryMeans[category], categoryStdErrs[category]));
236 for (var test in testMeansByCategory[category]) {
237 var shortName = test.replace(/^[^-]*-/, "");
238 print(resultLine(labelWidth, 4, shortName, meanWidth, testMeansByCategory[category][test], testStdErrsByCategory[category][test]));