diff --git a/html/index.html b/html/index.html
index 6fe0e77..6b6fa80 100644
--- a/html/index.html
+++ b/html/index.html
@@ -25,5 +25,18 @@
Web Latency Benchmark
The benchmark server is no longer running. You must restart it before running the test.
+
+
List of Available Tests
+
+ - 1. Keydown latency
+ - 2. Scroll latency
+ - 3. Native reference
+ - 4. Baseline jank
>
+ - 5. Javascript jank
+ - 6. Image loading jank
+ - 7. Worker GC Load
+
+
+
diff --git a/html/latency-benchmark.js b/html/latency-benchmark.js
index 4632b65..e8d52b1 100644
--- a/html/latency-benchmark.js
+++ b/html/latency-benchmark.js
@@ -72,6 +72,19 @@ var preventContextMenuAndSelection = function(e) {
return false;
}
+var parseUrl = function(q) {
+ var exp = q.substr(q.indexOf("=") + 1, q.length);
+ return exp.split(exp.match(/\D/));
+};
+
+var genArray = function(range) {
+ var arr = new Array();
+ for(var i = 0; i < range; i++) {
+ arr[i] = i+1;
+ }
+
+ return arr;
+}
var addEvents = function() {
document.addEventListener('keydown', preventContextMenuAndSelection);
@@ -142,12 +155,26 @@ var spinDone = true;
workerHandlers.spin = function(e) {
spinDone = true;
};
+workerHandlers.gcLoad = function(e) {
+ return test.finishedMeasuring = true;
+};
// We don't use getPrefixed here because we want to replace the unprefixed version with the prefixed one if it exists.
if (worker) {
worker.postMessage = worker.webkitPostMessage || worker.mozPostMessage || worker.oPostMessage ||worker.msPostMessage || worker.postMessage;
}
+var workerGCLoad = function() {
+ if (!worker)
+ return fail(this);
+ var test = this;
+ try {
+ worker.postMessage({test: 'gcLoad'});
+ } catch(e) {
+ fail(this);
+ }
+}
+
var checkTransferables = function() {
if (!worker || !window.ArrayBuffer)
return fail(this);
@@ -427,6 +454,9 @@ var tests = [
{ name: 'Image loading jank',
info: 'Tests responsiveness during image loading.',
test: testJank, blocker: loadGiantImage, report: ['css', 'js', 'scroll'] },
+ { name: 'Worker GC Load',
+ info: 'Tests if worker GC affects main page.',
+ test: testJank, blocker: workerGCLoad, report: ['js', 'scroll'] },
// These tests work, but are disabled for now to focus on the latency test.
// { name: 'requestAnimationFrame', test: checkName, toCheck: 'requestAnimationFrame' },
// { name: 'Canvas 2D', test: checkName, toCheck: 'HTMLCanvasElement' },
@@ -474,29 +504,39 @@ var tests = [
// { name: 'Worker GC doesn\'t affect main page', test: testJank, blocker: workerGCLoad },
];
-for (var i = 0; i < tests.length; i++) {
- var test = tests[i];
- var row = document.createElement('tr');
- var nameCell = document.createElement('td');
- var resultCell = document.createElement('td');
- var infoCell = document.createElement('td');
- nameCell.className = 'testName';
- nameCell.textContent = test.name;
- var description = document.createElement('div');
- description.className = 'testDescription';
- nameCell.appendChild(description);
- if (test.info) {
- description.textContent = test.info;
+if(window.location.search) {
+ var testIndexes = parseUrl(window.location.search);
+}
+
+var testList = testIndexes || genArr(tests.length);
+
+for (var i = 0; i < testList.length; i++) {
+ if(testList[i] <= tests.length) {
+ var test = tests[testList[i]-1];
+ var row = document.createElement('tr');
+ var nameCell = document.createElement('td');
+ var resultCell = document.createElement('td');
+ var infoCell = document.createElement('td');
+ nameCell.className = 'testName';
+ nameCell.textContent = test.name;
+ var description = document.createElement('div');
+ description.className = 'testDescription';
+ nameCell.appendChild(description);
+ if (test.info) {
+ description.textContent = test.info;
+ }
+ resultCell.className = 'testResult';
+ test.resultCell = document.createElement('div');
+ resultCell.appendChild(test.resultCell);
+ infoCell.className = 'testInfo';
+ test.infoCell = infoCell;
+ row.appendChild(nameCell);
+ row.appendChild(resultCell);
+ row.appendChild(infoCell);
+ table.appendChild(row);
+ } else {
+ document.getElementById("progressMessage").textContent = "Error: test index "+ testList[i] +" out of range.";
}
- resultCell.className = 'testResult';
- test.resultCell = document.createElement('div');
- resultCell.appendChild(test.resultCell);
- infoCell.className = 'testInfo';
- test.infoCell = infoCell;
- row.appendChild(nameCell);
- row.appendChild(resultCell);
- row.appendChild(infoCell);
- table.appendChild(row);
}
var nextTestIndex = 0;
@@ -509,13 +549,13 @@ var runNextTest = function(previousTest) {
return;
}
previousTest.finished = true;
- if (previousTest != tests[nextTestIndex - 1]) {
+ if (previousTest != tests[testList[nextTestIndex - 1]-1]) {
previousTest.infoCell.textContent = "Error: test sent results out of order";
return;
}
}
var testIndex = nextTestIndex++;
- if (testIndex >= tests.length) {
+ if (testIndex >= testList.length) {
// All tests successfully completed. Report the overall score as a number out of 10.
var scoreRatio = totalScore / totalPossibleScore;
var score = document.getElementById('score');
@@ -528,7 +568,7 @@ var runNextTest = function(previousTest) {
// End the test run.
return;
}
- var test = tests[testIndex];
+ var test = tests[testList[testIndex]-1];
test.infoCell.textContent = '';
test.resultCell.textContent = '⋯';
setTimeout(function() { checkTimeout(test); }, 50000);
diff --git a/html/worker.js b/html/worker.js
index 8b21abf..8372a2d 100644
--- a/html/worker.js
+++ b/html/worker.js
@@ -25,6 +25,30 @@ self.onmessage = function(e) {
var start = getMs();
while (getMs() - e.data.lengthMs < start);
self.postMessage(e.data);
+ } else if (e.data.test == 'gcLoad') {
+ var createObjects = function(n) {
+ var a = new Array(1000*n);
+ var count = 0;
+ for(var i=0; i