blob: b59e44c240d1161e3eec7d85eeca7ca0e0bd73be [file] [log] [blame]
<!DOCTYPE html>
<body>
<script src="../resources/runner.js"></script>
<script>
var spec = PerfTestRunner.loadFile("resources/html5.html");
var chunks = [];
// The smaller the chunks the more style resolves we do.
// Smaller chunk sizes will show more samples in style resolution.
// Larger chunk sizes will show more samples in line layout.
// Smaller chunk sizes run slower overall, as the per-chunk overhead is high.
// Testing on my machine has shown that we need 10-15 chunks before style resolution is always the top sample.
var chunkSize = 500000; // 6.09mb / 500k = approx 13 chunks (thus 13 forced layouts/style resolves).
var chunkCount = Math.ceil(spec.length / chunkSize);
for (var chunkIndex = 0; chunkIndex < chunkCount; chunkIndex++) {
var chunk = spec.substring(chunkIndex * chunkSize, chunkSize);
chunks.push(chunk);
}
PerfTestRunner.logInfo("Testing " + spec.length + " byte document in " + chunkCount + " " + chunkSize + " byte chunks.");
function loadChunkedSpecIntoIframe(iframe) {
// Note: We've inlined the stylesheets in html5.html. Before we did that, it seemed to be
// random as to whether style resolution would show up at all in the samples.
// Talking with Hyatt and jamesr we believe this may be the ignorePendingStylesheets
// logic which is triggered off of a timer which is fired after the load completes.
// By inlining the stylesheets we're avoiding this race condition.
iframe.sandbox = ''; // Prevent external loads which could cause write() to return before completing the parse.
iframe.style.width = "600px"; // Have a reasonable size so we're not line-breaking on every character.
iframe.style.height = "800px";
iframe.contentDocument.open();
for (var chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {
iframe.contentDocument.write(chunks[chunkIndex]);
// Note that we won't cause a style resolve until we've encountered the <body> element.
// Thus the number of chunks counted above is not exactly equal to the number of style resolves.
if (iframe.contentDocument.body)
iframe.contentDocument.body.clientHeight; // Force a full layout/style-resolve.
}
iframe.contentDocument.close();
}
// Running from the onload callback just makes the UI nicer as it shows the logs before starting the test.
window.onload = function() {
// Depending on the chosen chunk size, iterations can take over 60s to run on a fast machine, so we only run 2.
PerfTestRunner.measureTime({run: function() {
var iframe = document.createElement("iframe");
document.body.appendChild(iframe);
loadChunkedSpecIntoIframe(iframe);
document.body.removeChild(iframe);
}, runCount: 2});
}
</script>
</body>