294 lines
7.7 KiB
HTML
294 lines
7.7 KiB
HTML
<!DOCTYPE HTML>
|
|
<html>
|
|
<head>
|
|
<title>Performance Tests</title>
|
|
<style>
|
|
body { font-family: Tahoma, Serif; font-size: 9pt; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h1>Performance Tests</h1>
|
|
<input type="button" value="Run Tests" onClick="run();" id="run"/> Filter: <input type="text" size="50" id="filters"/>
|
|
<div><span id="statusBox"></span> <progress id="progressBox" value="0" style="display:none"></progress></div>
|
|
|
|
<div style="padding-top:10px; padding-bottom:10px">
|
|
<table id="resultTable" border="1" cellspacing="1" cellpadding="4">
|
|
<thead>
|
|
<tr>
|
|
<td>Name</td>
|
|
<td>Iterations per Run</td>
|
|
<td>Avg (ms)</td>
|
|
<td>Min (ms)</td>
|
|
<td>Max (ms)</td>
|
|
<td>StdDev (ms)</td>
|
|
<td>Runs (ms)</td>
|
|
</tr>
|
|
</thead>
|
|
<!-- result rows here -->
|
|
</table>
|
|
</div>
|
|
|
|
<hr width="80%">
|
|
|
|
Result 1: <input type="text" size="100" id="result1"/>
|
|
<br/>Result 2: <input type="text" size="100" id="result2"/>
|
|
<br/><input type="button" value="Compare" onClick="compare();" id="compare"/>
|
|
|
|
<div style="padding-top:10px; padding-bottom:10px">
|
|
<table id="compareTable" border="1" cellspacing="1" cellpadding="4">
|
|
<thead>
|
|
<tr>
|
|
<td>Name</td>
|
|
<td>Result 1 Avg (ms)</td>
|
|
<td>Result 2 Avg (ms)</td>
|
|
<td>% Diff</td>
|
|
</tr>
|
|
</thead>
|
|
<!-- result rows here -->
|
|
</table>
|
|
</div>
|
|
|
|
<script type="text/javascript">
|
|
function run() {
|
|
var runElement = document.getElementById("run");
|
|
var filtersElement = document.getElementById("filters");
|
|
var compareElement = document.getElementById("compare");
|
|
var result1Element = document.getElementById("result1");
|
|
var result2Element = document.getElementById("result2");
|
|
|
|
// Number of runs for each test.
|
|
var testRuns = 10;
|
|
|
|
// Delay between test runs.
|
|
var runDelay = 0;
|
|
|
|
// Retrieve the list of all tests.
|
|
var allTests = window.GetPerfTests();
|
|
|
|
// Populated with the list of tests that will be run.
|
|
var tests = [];
|
|
var currentTest = 0;
|
|
|
|
var testList = filtersElement.value.trim();
|
|
if (testList.length > 0) {
|
|
// Include or exclude specific tests.
|
|
var included = [];
|
|
var excluded = [];
|
|
|
|
var testNames = testList.split(",");
|
|
|
|
// Identify included and excluded tests.
|
|
for (i = 0; i < testNames.length; ++i) {
|
|
var testName = testNames[i].trim();
|
|
if (testName[0] == '-') {
|
|
// Exclude the test.
|
|
excluded.push(testName.substr(1));
|
|
} else {
|
|
// Include the test.
|
|
included.push(testName);
|
|
}
|
|
}
|
|
|
|
if (included.length > 0) {
|
|
// Only use the included tests.
|
|
for (i = 0; i < allTests.length; ++i) {
|
|
var test = allTests[i];
|
|
var testName = test[0];
|
|
if (included.indexOf(testName) >= 0)
|
|
tests.push(test);
|
|
}
|
|
} else if (excluded.length > 0) {
|
|
// Use all tests except the excluded tests.
|
|
for (i = 0; i < allTests.length; ++i) {
|
|
var test = allTests[i];
|
|
var testName = test[0];
|
|
if (excluded.indexOf(testName) < 0)
|
|
tests.push(test);
|
|
}
|
|
}
|
|
} else {
|
|
// Run all tests.
|
|
tests = allTests;
|
|
}
|
|
|
|
function updateStatusComplete() {
|
|
var statusBox = document.getElementById("statusBox");
|
|
statusBox.innerText = 'All tests completed.';
|
|
|
|
runElement.disabled = false;
|
|
filtersElement.disabled = false;
|
|
result1Element.disabled = false;
|
|
result2Element.disabled = false;
|
|
compareElement.disabled = false;
|
|
}
|
|
|
|
function updateStatus(test) {
|
|
var statusBox = document.getElementById("statusBox");
|
|
var progressBox = document.getElementById("progressBox");
|
|
|
|
if (test.run >= test.totalRuns) {
|
|
statusBox.innerText = test.name + " completed.";
|
|
progressBox.style.display = 'none';
|
|
} else {
|
|
statusBox.innerText = test.name + " (" + test.run + "/" + test.totalRuns + ")";
|
|
progressBox.value = (test.run / test.totalRuns);
|
|
progressBox.style.display = 'inline';
|
|
}
|
|
}
|
|
|
|
function appendResult(test) {
|
|
var e = document.getElementById("resultTable");
|
|
|
|
// Calculate the average.
|
|
var avg = test.total / test.totalRuns;
|
|
|
|
// Calculate the standard deviation.
|
|
var sqsum = 0;
|
|
for (i = 0; i < test.results.length; ++i) {
|
|
var diff = test.results[i] - avg;
|
|
sqsum += diff * diff;
|
|
}
|
|
var stddev = Math.round(Math.sqrt(sqsum / test.totalRuns) * 100.0) / 100.0;
|
|
|
|
e.insertAdjacentHTML("beforeEnd", [
|
|
"<tr>",
|
|
"<td>", test.name, "</td>",
|
|
"<td>", test.iterations, "</td>",
|
|
"<td>", avg, "</td>",
|
|
"<td>", test.min, "</td>",
|
|
"<td>", test.max, "</td>",
|
|
"<td>", stddev, "</td>",
|
|
"<td>", test.results.join(", "), "</td>",
|
|
"<tr>"
|
|
].join(""));
|
|
|
|
if (result1Element.value.length > 0)
|
|
result1Element.value += ",";
|
|
result1Element.value += test.name + "=" + avg;
|
|
}
|
|
|
|
// Execute the test function.
|
|
function execTestFunc(name) {
|
|
return window.RunPerfTest(name);
|
|
}
|
|
|
|
// Schedule the next test.
|
|
function nextTest(test) {
|
|
appendResult(test);
|
|
currentTest++;
|
|
runTest();
|
|
}
|
|
|
|
// Schedule the next step for the current test.
|
|
function nextTestStep(test) {
|
|
setTimeout(function () { execTest(test); }, runDelay);
|
|
}
|
|
|
|
// Perform the next step for the current test.
|
|
function execTest(test) {
|
|
updateStatus(test);
|
|
|
|
if (!test.warmedUp) {
|
|
execTestFunc(test.name);
|
|
test.warmedUp = true;
|
|
return nextTestStep(test);
|
|
}
|
|
|
|
if (test.run >= test.totalRuns)
|
|
return nextTest(test);
|
|
|
|
var elapsed = execTestFunc(test.name);
|
|
test.results.push(elapsed);
|
|
|
|
test.total += elapsed;
|
|
if (!test.min) test.min = elapsed;
|
|
else if (test.min > elapsed) test.min = elapsed;
|
|
if (!test.max) test.max = elapsed;
|
|
else if (test.max < elapsed) test.max = elapsed;
|
|
|
|
test.run++;
|
|
|
|
return nextTestStep(test);
|
|
}
|
|
|
|
function runTest() {
|
|
if (currentTest == tests.length) {
|
|
updateStatusComplete();
|
|
return;
|
|
}
|
|
|
|
var test = {
|
|
name: tests[currentTest][0],
|
|
iterations: tests[currentTest][1],
|
|
warmedUp: false,
|
|
total: 0,
|
|
totalRuns: testRuns,
|
|
run: 0,
|
|
results: []
|
|
};
|
|
setTimeout(function () { execTest(test); }, runDelay);
|
|
}
|
|
|
|
// Schedule the first test.
|
|
if (tests.length > 0) {
|
|
runElement.disabled = true;
|
|
filtersElement.disabled = true;
|
|
result1Element.value = "";
|
|
result1Element.disabled = true;
|
|
result2Element.disabled = true;
|
|
compareElement.disabled = true;
|
|
|
|
runTest();
|
|
}
|
|
}
|
|
|
|
function compare() {
|
|
var result1 = document.getElementById("result1").value.trim();
|
|
var result2 = document.getElementById("result2").value.trim();
|
|
|
|
if (result1.length == 0 || result2.length == 0)
|
|
return;
|
|
|
|
var r1values = result1.split(",");
|
|
var r2values = result2.split(",");
|
|
for (i = 0; i < r1values.length; ++i) {
|
|
var r1parts = r1values[i].split("=");
|
|
var r1name = r1parts[0].trim();
|
|
var r1val = r1parts[1].trim();
|
|
|
|
for (x = 0; x < r2values.length; ++x) {
|
|
var r2parts = r2values[x].split("=");
|
|
var r2name = r2parts[0].trim();
|
|
var r2val = r2parts[1].trim();
|
|
|
|
if (r2name == r1name) {
|
|
appendResult(r1name, r1val, r2val);
|
|
|
|
// Remove the matching index.
|
|
r2values.splice(x, 1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function appendResult(name, r1val, r2val) {
|
|
var e = document.getElementById("compareTable");
|
|
|
|
// Calculate the percent difference.
|
|
var diff = Math.round(((r2val - r1val) / r1val) * 10000.0) / 100.0;
|
|
|
|
e.insertAdjacentHTML("beforeEnd", [
|
|
"<tr>",
|
|
"<td>", name, "</td>",
|
|
"<td>", r1val, "</td>",
|
|
"<td>", r2val, "</td>",
|
|
"<td>", diff, "</td>",
|
|
"<tr>"
|
|
].join(""));
|
|
}
|
|
}
|
|
</script>
|
|
|
|
</body>
|
|
</html>
|