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

+ +
+ 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