Add measurePageLoadTime function to PerfTestRunner
authorzoltan@webkit.org <zoltan@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Oct 2012 22:03:55 +0000 (22:03 +0000)
committerzoltan@webkit.org <zoltan@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Oct 2012 22:03:55 +0000 (22:03 +0000)
https://bugs.webkit.org/show_bug.cgi?id=100029

Reviewed by Ryosuke Niwa.

Adopt chunk based loading logic from html5-full-render.html into measurePageLoadTime function,
this is needed to measure the performance and the memory consumption of the PageLoadTests as
we do it for all other performancetests.

* Parser/html5-full-render.html: Move the behavior to runner.js.
* resources/runner.js:
(.): Add measurePageLoadTime function.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@132273 268f45cc-cd09-0410-ab3c-d52691b4dbfc

PerformanceTests/ChangeLog
PerformanceTests/Parser/html5-full-render.html
PerformanceTests/resources/runner.js

index 570e49f..617bce4 100644 (file)
@@ -1,3 +1,18 @@
+2012-10-23  Zoltan Horvath  <zoltan@webkit.org>
+
+        Add measurePageLoadTime function to PerfTestRunner
+        https://bugs.webkit.org/show_bug.cgi?id=100029
+
+        Reviewed by Ryosuke Niwa.
+
+        Adopt chunk based loading logic from html5-full-render.html into measurePageLoadTime function,
+        this is needed to measure the performance and the memory consumption of the PageLoadTests as
+        we do it for all other performancetests.
+
+        * Parser/html5-full-render.html: Move the behavior to runner.js.
+        * resources/runner.js:
+        (.): Add measurePageLoadTime function.
+
 2012-10-22  Adam Barth  <abarth@webkit.org>
 
         [V8] Vastly simplify V8GCController's NodeVisitor
index 026b7f5..5b7ccad 100644 (file)
@@ -2,54 +2,11 @@
 <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.substr(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: 5});
+    PerfTestRunner.measurePageLoadTime({path: "resources/html5.html",
+    chunkSize: 500000, // 6.09mb / 500k = approx 13 chunks (thus 13 forced layouts/style resolves).
+    runCount: 5 }); // Depending on the chosen chunk size, iterations can take over 60s to run on a fast machine, so we only run 5.
 }
 
 </script>
index 15ac488..6df3b9f 100755 (executable)
@@ -303,5 +303,50 @@ if (window.testRunner) {
         return PerfTestRunner.now() - startTime;
     }
 
+
+    PerfTestRunner.measurePageLoadTime = function(test) {
+        test.run = function() {
+            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.
+            var chunkCount = Math.ceil(this.file.length / this.chunkSize);
+            for (var chunkIndex = 0; chunkIndex < chunkCount; chunkIndex++) {
+                var chunk = this.file.substr(chunkIndex * this.chunkSize, this.chunkSize);
+                chunks.push(chunk);
+            }
+
+            PerfTestRunner.logInfo("Testing " + this.file.length + " byte document in " + chunkCount + " " + this.chunkSize + " byte chunks.");
+
+            var iframe = document.createElement("iframe");
+            document.body.appendChild(iframe);
+
+            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.
+                else if (iframe.documentElement.localName == 'html')
+                    iframe.contentDocument.documentElement.offsetWidth; // Force the painting.
+            }
+
+            iframe.contentDocument.close();
+            document.body.removeChild(iframe);
+        };
+
+        this.file = PerfTestRunner.loadFile(test.path);
+        if (!test.chunkSize)
+            this.chunkSize = 50000;
+
+        PerfTestRunner.measureTime(test);
+    }
+
     window.PerfTestRunner = PerfTestRunner;
 })();