1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/* 2563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Copyright (C) 2007 Apple Inc. All rights reserved. 3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Redistribution and use in source and binary forms, with or without 5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * modification, are permitted provided that the following conditions 6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * are met: 7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 1. Redistributions of source code must retain the above copyright 8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * notice, this list of conditions and the following disclaimer. 9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 2. Redistributions in binary form must reproduce the above copyright 10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * notice, this list of conditions and the following disclaimer in the 11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * documentation and/or other materials provided with the distribution. 12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */ 25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkfunction sunspiderCompareResults(output1, output2) 27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 28563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var count1 = output1.length; 29563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var count2 = output2.length; 30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 31563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var itemTotals1 = {}; 32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals1.length = count1; 33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 34563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var total1 = 0; 35563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var categoryTotals1 = {}; 36563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var testTotalsByCategory1 = {}; 37563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var mean1 = 0; 39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var categoryMeans1 = {}; 40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var testMeansByCategory1 = {}; 41563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 42563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var stdDev1 = 0; 43563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var categoryStdDevs1 = {}; 44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var testStdDevsByCategory1 = {}; 45563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 46563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var stdErr1 = 0; 47563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var categoryStdErrs1 = {}; 48563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var testStdErrsByCategory1 = {}; 49563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 50563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var itemTotals2 = {}; 51563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals2.length = count2; 52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 53563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var total2 = 0; 54563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var categoryTotals2 = {}; 55563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var testTotalsByCategory2 = {}; 56563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 57563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var mean2 = 0; 58563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var categoryMeans2 = {}; 59563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var testMeansByCategory2 = {}; 60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 61563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var stdDev2 = 0; 62563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var categoryStdDevs2 = {}; 63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var testStdDevsByCategory2 = {}; 64563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var stdErr2 = 0; 66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var categoryStdErrs2 = {}; 67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var testStdErrsByCategory2 = {}; 68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function initialize() 70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals1 = {total: []}; 72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var i = 0; i < categories.length; i++) { 74563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var category = categories[i]; 75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals1[category] = []; 76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark categoryTotals1[category] = 0; 77563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testTotalsByCategory1[category] = {}; 78563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark categoryMeans1[category] = 0; 79563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testMeansByCategory1[category] = {}; 80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark categoryStdDevs1[category] = 0; 81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testStdDevsByCategory1[category] = {}; 82563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark categoryStdErrs1[category] = 0; 83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testStdErrsByCategory1[category] = {}; 84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 85563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 86563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var i = 0; i < tests.length; i++) { 87563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var test = tests[i]; 88563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals1[test] = []; 89563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var category = test.replace(/-.*/, ""); 90563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testTotalsByCategory1[category][test] = 0; 91563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testMeansByCategory1[category][test] = 0; 92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testStdDevsByCategory1[category][test] = 0; 93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testStdErrsByCategory1[category][test] = 0; 94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var i = 0; i < count1; i++) { 97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals1["total"][i] = 0; 98563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var category in categoryTotals1) { 99563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals1[category][i] = 0; 100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var test in testTotalsByCategory1[category]) { 101563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals1[test][i] = 0; 102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 103563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 104563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 105563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 106563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals2 = {total: []}; 107563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 108563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var i = 0; i < categories.length; i++) { 109563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var category = categories[i]; 110563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals2[category] = []; 111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark categoryTotals2[category] = 0; 112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testTotalsByCategory2[category] = {}; 113563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark categoryMeans2[category] = 0; 114563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testMeansByCategory2[category] = {}; 115563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark categoryStdDevs2[category] = 0; 116563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testStdDevsByCategory2[category] = {}; 117563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark categoryStdErrs2[category] = 0; 118563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testStdErrsByCategory2[category] = {}; 119563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 120563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 121563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var i = 0; i < tests.length; i++) { 122563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var test = tests[i]; 123563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals2[test] = []; 124563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var category = test.replace(/-.*/, ""); 125563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testTotalsByCategory2[category][test] = 0; 126563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testMeansByCategory2[category][test] = 0; 127563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testStdDevsByCategory2[category][test] = 0; 128563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testStdErrsByCategory2[category][test] = 0; 129563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 130563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var i = 0; i < count2; i++) { 132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals2["total"][i] = 0; 133563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var category in categoryTotals2) { 134563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals2[category][i] = 0; 135563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var test in testTotalsByCategory2[category]) { 136563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals2[test][i] = 0; 137563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 138563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 139563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 140563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 141563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 142563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 143563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function computeItemTotals(output, itemTotals) 144563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 145563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var i = 0; i < output.length; i++) { 146563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var result = output[i]; 147563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var test in result) { 148563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var time = result[test]; 149563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var category = test.replace(/-.*/, ""); 150563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals["total"][i] += time; 151563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals[category][i] += time; 152563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark itemTotals[test][i] += time; 153563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 154563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 155563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 156563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 157563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function computeTotals(output, categoryTotals, testTotalsByCategory) 158563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 159563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var total = 0; 160563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 161563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var i = 0; i < output.length; i++) { 162563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var result = output[i]; 163563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var test in result) { 164563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var time = result[test]; 165563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var category = test.replace(/-.*/, ""); 166563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark total += time; 167563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark categoryTotals[category] += time; 168563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testTotalsByCategory[category][test] += time; 169563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 170563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 171563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 172563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return total; 173563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 174563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 175563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function computeMeans(count, total, categoryTotals, categoryMeans, testTotalsByCategory, testMeansByCategory) 176563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 177563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var mean = total / count; 178563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var category in categoryTotals) { 179563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark categoryMeans[category] = categoryTotals[category] / count; 180563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var test in testTotalsByCategory[category]) { 181563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testMeansByCategory[category][test] = testTotalsByCategory[category][test] / count; 182563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 183563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 184563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return mean; 185563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 186563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 187563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function standardDeviation(mean, items) 188563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 189563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var deltaSquaredSum = 0; 190563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var i = 0; i < items.length; i++) { 191563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var delta = items[i] - mean; 192563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark deltaSquaredSum += delta * delta; 193563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 194563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark variance = deltaSquaredSum / (items.length - 1); 195563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return Math.sqrt(variance); 196563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 197563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 198563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function computeStdDevs(mean, itemTotals, categoryStdDevs, categoryMeans, testStdDevsByCategory, testMeansByCategory) 199563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 200563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var stdDev = standardDeviation(mean, itemTotals["total"]); 201563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var category in categoryStdDevs) { 202563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark categoryStdDevs[category] = standardDeviation(categoryMeans[category], itemTotals[category]); 203563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 204563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var category in categoryStdDevs) { 205563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var test in testStdDevsByCategory[category]) { 206563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testStdDevsByCategory[category][test] = standardDeviation(testMeansByCategory[category][test], itemTotals[test]); 207563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 208563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 209563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return stdDev; 210563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 211563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 212563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function computeStdErrors(count, stdDev, categoryStdErrs, categoryStdDevs, testStdErrsByCategory, testStdDevsByCategory) 213563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 214563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var sqrtCount = Math.sqrt(count); 215563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 216563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var stdErr = stdDev / sqrtCount; 217563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var category in categoryStdErrs) { 218563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark categoryStdErrs[category] = categoryStdDevs[category] / sqrtCount; 219563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 220563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var category in categoryStdDevs) { 221563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var test in testStdErrsByCategory[category]) { 222563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark testStdErrsByCategory[category][test] = testStdDevsByCategory[category][test] / sqrtCount; 223563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 224563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 225563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 226563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return stdErr; 227563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 228563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 229563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var tDistribution = [NaN, NaN, 12.71, 4.30, 3.18, 2.78, 2.57, 2.45, 2.36, 2.31, 2.26, 2.23, 2.20, 2.18, 2.16, 2.14, 2.13, 2.12, 2.11, 2.10, 2.09, 2.09, 2.08, 2.07, 2.07, 2.06, 2.06, 2.06, 2.05, 2.05, 2.05, 2.04, 2.04, 2.04, 2.03, 2.03, 2.03, 2.03, 2.03, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.96]; 230563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var tMax = tDistribution.length; 231563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var tLimit = 1.96; 232563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 233563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function tDist(n) 234563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 235563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (n > tMax) 236563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return tLimit; 237563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return tDistribution[n]; 238563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 239563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 240563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 241563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function formatMean(meanWidth, mean, stdErr, count) 242563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 243563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var meanString = mean.toFixed(1).toString(); 244563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark while (meanString.length < meanWidth) { 245563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark meanString = " " + meanString; 246563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 248563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var error = "+/- " + ((tDist(count) * stdErr / mean) * 100).toFixed(1) + "% "; 249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return meanString + "ms " + error; 251563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 252563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 253563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function computeLabelWidth() 254563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 255563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var width = "Total".length; 256563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var category in categoryMeans1) { 257563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (category.length + 2 > width) 258563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark width = category.length + 2; 259563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var i = 0; i < tests.length; i++) { 261563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var shortName = tests[i].replace(/^[^-]*-/, ""); 262563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (shortName.length + 4 > width) 263563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark width = shortName.length + 4; 264563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 265563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 266563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return width; 267563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 268563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 269563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function computeMeanWidth(mean, categoryMeans, testMeansByCategory) 270563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 271563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var width = mean.toFixed(1).toString().length; 272563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var category in categoryMeans) { 273563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var candidate = categoryMeans[category].toFixed(1).toString().length; 274563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (candidate > width) 275563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark width = candidate; 276563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var test in testMeansByCategory[category]) { 277563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var candidate = testMeansByCategory[category][test].toFixed(1).toString().length; 278563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (candidate > width) 279563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark width = candidate; 280563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 281563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 282563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 283563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return width; 284563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 285563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 286563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function pad(str, n) 287563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 288563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark while (str.length < n) { 289563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark str += " "; 290563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 291563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return str; 292563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 293563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 294563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function resultLine(labelWidth, indent, label, meanWidth1, mean1, stdErr1, meanWidth2, mean2, stdErr2) 295563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 296563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark result = pad("", indent); 297563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark result += label + ": "; 298563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark result = pad(result, labelWidth + 2); 299563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 3006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen var t = (mean1 - mean2) / (Math.sqrt((stdErr1 * stdErr1) + (stdErr2 * stdErr2))); 301563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var df = count1 + count2 - 2; 302563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 303563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var statisticallySignificant = (Math.abs(t) > tDist(df+1)); 304563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var diff = mean2 - mean1; 305563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var percentage = 100 * diff / mean1; 306563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var isFaster = diff < 0; 307563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var probablySame = (percentage < 0.1) && !statisticallySignificant; 308563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var ratio = isFaster ? (mean1 / mean2) : (mean2 / mean1); 309563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var fixedRatio = (ratio < 1.2) ? ratio.toFixed(3).toString() : ((ratio < 10) ? ratio.toFixed(2).toString() : ratio.toFixed(1).toString()); 310563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var formattedRatio = isFaster ? fixedRatio + "x as fast" : "*" + fixedRatio + "x as slow*"; 311563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 312563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var diffSummary; 313563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var diffDetail; 314563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 315563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (probablySame) { 316563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark diffSummary = "-"; 317563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark diffDetail = ""; 318563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } else if (!statisticallySignificant) { 319563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark diffSummary = "??"; 320563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark diffDetail = " not conclusive: might be " + formattedRatio; 321563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } else { 322563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark diffSummary = formattedRatio; 323563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark diffDetail = " significant"; 324563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 325563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 326563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return result + pad(diffSummary, 18) + formatMean(meanWidth1, mean1, stdErr1, count1) + " " + formatMean(meanWidth2, mean2, stdErr2, count2) + diffDetail; 327563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 328563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 329563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark function printOutput() 330563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 331563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var labelWidth = computeLabelWidth(); 332563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var meanWidth1 = computeMeanWidth(mean1, categoryMeans1, testMeansByCategory1); 333563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var meanWidth2 = computeMeanWidth(mean2, categoryMeans2, testMeansByCategory2); 334563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 335563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark print("\n"); 336563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var header = "TEST"; 337563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark while (header.length < labelWidth) 338563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark header += " "; 339563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark header += " COMPARISON FROM TO DETAILS"; 340563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark print(header); 341563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark print(""); 342563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark print("============================================================================="); 343563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark print(""); 344563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark print(resultLine(labelWidth, 0, "** TOTAL **", meanWidth1, mean1, stdErr1, meanWidth2, mean2, stdErr2)); 345563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark print(""); 346563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark print("============================================================================="); 347563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 348563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var category in categoryMeans1) { 349563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark print(""); 350563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark print(resultLine(labelWidth, 2, category, 351563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark meanWidth1, categoryMeans1[category], categoryStdErrs1[category], 352563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark meanWidth2, categoryMeans2[category], categoryStdErrs2[category])); 353563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (var test in testMeansByCategory1[category]) { 354563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark var shortName = test.replace(/^[^-]*-/, ""); 355563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark print(resultLine(labelWidth, 4, shortName, 356563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark meanWidth1, testMeansByCategory1[category][test], testStdErrsByCategory1[category][test], 357563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark meanWidth2, testMeansByCategory2[category][test], testStdErrsByCategory2[category][test])); 358563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 359563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 360563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 361563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 362563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark initialize(); 363563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 364563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark computeItemTotals(output1, itemTotals1); 365563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark computeItemTotals(output2, itemTotals2); 366563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 367563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark total1 = computeTotals(output1, categoryTotals1, testTotalsByCategory1); 368563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark total2 = computeTotals(output2, categoryTotals2, testTotalsByCategory2); 369563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 370563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark mean1 = computeMeans(count1, total1, categoryTotals1, categoryMeans1, testTotalsByCategory1, testMeansByCategory1); 371563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark mean2 = computeMeans(count2, total2, categoryTotals2, categoryMeans2, testTotalsByCategory2, testMeansByCategory2); 372563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 373563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark stdDev1 = computeStdDevs(mean1, itemTotals1, categoryStdDevs1, categoryMeans1, testStdDevsByCategory1, testMeansByCategory1); 374563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark stdDev2 = computeStdDevs(mean2, itemTotals2, categoryStdDevs2, categoryMeans2, testStdDevsByCategory2, testMeansByCategory2); 375563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 376563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark stdErr1 = computeStdErrors(count1, stdDev1, categoryStdErrs1, categoryStdDevs1, testStdErrsByCategory1, testStdDevsByCategory1); 377563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark stdErr2 = computeStdErrors(count2, stdDev2, categoryStdErrs2, categoryStdDevs2, testStdErrsByCategory2, testStdDevsByCategory2); 378563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 379563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark printOutput(); 380563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 381