📄 sunspider-compare-results.js
字号:
deltaSquaredSum += delta * delta; } variance = deltaSquaredSum / (items.length - 1); return Math.sqrt(variance); } function computeStdDevs(mean, itemTotals, categoryStdDevs, categoryMeans, testStdDevsByCategory, testMeansByCategory) { var stdDev = standardDeviation(mean, itemTotals["total"]); for (var category in categoryStdDevs) { categoryStdDevs[category] = standardDeviation(categoryMeans[category], itemTotals[category]); } for (var category in categoryStdDevs) { for (var test in testStdDevsByCategory[category]) { testStdDevsByCategory[category][test] = standardDeviation(testMeansByCategory[category][test], itemTotals[test]); } } return stdDev; } function computeStdErrors(count, stdDev, categoryStdErrs, categoryStdDevs, testStdErrsByCategory, testStdDevsByCategory) { var sqrtCount = Math.sqrt(count); var stdErr = stdDev / sqrtCount; for (var category in categoryStdErrs) { categoryStdErrs[category] = categoryStdDevs[category] / sqrtCount; } for (var category in categoryStdDevs) { for (var test in testStdErrsByCategory[category]) { testStdErrsByCategory[category][test] = testStdDevsByCategory[category][test] / sqrtCount; } } return stdErr; } 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]; var tMax = tDistribution.length; var tLimit = 1.96; function tDist(n) { if (n > tMax) return tLimit; return tDistribution[n]; } function formatMean(meanWidth, mean, stdErr, count) { var meanString = mean.toFixed(1).toString(); while (meanString.length < meanWidth) { meanString = " " + meanString; } var error = "+/- " + ((tDist(count) * stdErr / mean) * 100).toFixed(1) + "% "; return meanString + "ms " + error; } function computeLabelWidth() { var width = "Total".length; for (var category in categoryMeans1) { if (category.length + 2 > width) width = category.length + 2; } for (var i = 0; i < tests.length; i++) { var shortName = tests[i].replace(/^[^-]*-/, ""); if (shortName.length + 4 > width) width = shortName.length + 4; } return width; } function computeMeanWidth(mean, categoryMeans, testMeansByCategory) { var width = mean.toFixed(1).toString().length; for (var category in categoryMeans) { var candidate = categoryMeans[category].toFixed(1).toString().length; if (candidate > width) width = candidate; for (var test in testMeansByCategory[category]) { var candidate = testMeansByCategory[category][test].toFixed(1).toString().length; if (candidate > width) width = candidate; } } return width; } function pad(str, n) { while (str.length < n) { str += " "; } return str; } function resultLine(labelWidth, indent, label, meanWidth1, mean1, stdErr1, meanWidth2, mean2, stdErr2) { result = pad("", indent); result += label + ": "; result = pad(result, labelWidth + 2); var t = (mean1 - mean2) / (Math.sqrt((stdErr1 * stdErr1) + (stdErr1 * stdErr2))); var df = count1 + count2 - 2; var statisticallySignificant = (Math.abs(t) > tDist(df+1)); var diff = mean2 - mean1; var percentage = 100 * diff / mean1; var isFaster = diff < 0; var probablySame = (percentage < 0.1) && !statisticallySignificant; var ratio = isFaster ? (mean1 / mean2) : (mean2 / mean1); var fixedRatio = (ratio < 1.2) ? ratio.toFixed(3).toString() : ((ratio < 10) ? ratio.toFixed(2).toString() : ratio.toFixed(1).toString()); var formattedRatio = isFaster ? fixedRatio + "x as fast" : "*" + fixedRatio + "x as slow*"; var diffSummary; var diffDetail; if (probablySame) { diffSummary = "-"; diffDetail = ""; } else if (!statisticallySignificant) { diffSummary = "??"; diffDetail = " not conclusive: might be " + formattedRatio; } else { diffSummary = formattedRatio; diffDetail = " significant"; } return result + pad(diffSummary, 18) + formatMean(meanWidth1, mean1, stdErr1, count1) + " " + formatMean(meanWidth2, mean2, stdErr2, count2) + diffDetail; } function printOutput() { var labelWidth = computeLabelWidth(); var meanWidth1 = computeMeanWidth(mean1, categoryMeans1, testMeansByCategory1); var meanWidth2 = computeMeanWidth(mean2, categoryMeans2, testMeansByCategory2); print("\n"); var header = "TEST"; while (header.length < labelWidth) header += " "; header += " COMPARISON FROM TO DETAILS"; print(header); print(""); print("============================================================================="); print(""); print(resultLine(labelWidth, 0, "** TOTAL **", meanWidth1, mean1, stdErr1, meanWidth2, mean2, stdErr2)); print(""); print("============================================================================="); for (var category in categoryMeans1) { print(""); print(resultLine(labelWidth, 2, category, meanWidth1, categoryMeans1[category], categoryStdErrs1[category], meanWidth2, categoryMeans2[category], categoryStdErrs2[category])); for (var test in testMeansByCategory1[category]) { var shortName = test.replace(/^[^-]*-/, ""); print(resultLine(labelWidth, 4, shortName, meanWidth1, testMeansByCategory1[category][test], testStdErrsByCategory1[category][test], meanWidth2, testMeansByCategory2[category][test], testStdErrsByCategory2[category][test])); } } } initialize(); computeItemTotals(output1, itemTotals1); computeItemTotals(output2, itemTotals2); total1 = computeTotals(output1, categoryTotals1, testTotalsByCategory1); total2 = computeTotals(output2, categoryTotals2, testTotalsByCategory2); mean1 = computeMeans(count1, total1, categoryTotals1, categoryMeans1, testTotalsByCategory1, testMeansByCategory1); mean2 = computeMeans(count2, total2, categoryTotals2, categoryMeans2, testTotalsByCategory2, testMeansByCategory2); stdDev1 = computeStdDevs(mean1, itemTotals1, categoryStdDevs1, categoryMeans1, testStdDevsByCategory1, testMeansByCategory1); stdDev2 = computeStdDevs(mean2, itemTotals2, categoryStdDevs2, categoryMeans2, testStdDevsByCategory2, testMeansByCategory2); stdErr1 = computeStdErrors(count1, stdDev1, categoryStdErrs1, categoryStdDevs1, testStdErrsByCategory1, testStdDevsByCategory1); stdErr2 = computeStdErrors(count2, stdDev2, categoryStdErrs2, categoryStdDevs2, testStdErrsByCategory2, testStdDevsByCategory2); printOutput();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -