Speedometer 2.0: Elem test isn't updating DOM during the measurement
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 May 2017 10:09:13 +0000 (10:09 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 May 2017 10:09:13 +0000 (10:09 +0000)
https://bugs.webkit.org/show_bug.cgi?id=172343

Reviewed by Antti Koivisto.

Elem test wasn't doing much work because it simply enqueues items into the work queue, which doesn't get
executed until the next requestAnimationFrame or setTimeout callback happens.

Expose elm's work function as contentWindow.elemWork and make the first use of rAF a synchronous callback
just as it would when requestAnimationFrame isn't defined, and make the second use of rAF queue up to
an array of callbacks, and have the test runner manually invoke each callback.

This increases the runtime of the Elm suite from 100ms to 300ms on Safari.

* Speedometer/resources/tests.js:
(processElmWorkQueue): Added. A helper which processes Elm's work queue and manually invokes render callbacks.
* Speedometer/resources/todomvc/functional-prog-examples/elm/dist/elm.js:

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

PerformanceTests/ChangeLog
PerformanceTests/Speedometer/resources/tests.js
PerformanceTests/Speedometer/resources/todomvc/functional-prog-examples/elm/dist/elm.js

index 514c59d..3675be9 100644 (file)
@@ -1,3 +1,23 @@
+2017-05-19  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Speedometer 2.0: Elem test isn't updating DOM during the measurement
+        https://bugs.webkit.org/show_bug.cgi?id=172343
+
+        Reviewed by Antti Koivisto.
+
+        Elem test wasn't doing much work because it simply enqueues items into the work queue, which doesn't get
+        executed until the next requestAnimationFrame or setTimeout callback happens.
+
+        Expose elm's work function as contentWindow.elemWork and make the first use of rAF a synchronous callback
+        just as it would when requestAnimationFrame isn't defined, and make the second use of rAF queue up to
+        an array of callbacks, and have the test runner manually invoke each callback.
+
+        This increases the runtime of the Elm suite from 100ms to 300ms on Safari.
+
+        * Speedometer/resources/tests.js:
+        (processElmWorkQueue): Added. A helper which processes Elm's work queue and manually invokes render callbacks.
+        * Speedometer/resources/todomvc/functional-prog-examples/elm/dist/elm.js:
+
 2017-05-18  Ryosuke Niwa  <rniwa@webkit.org>
 
         Speedometer 2.0: Flight.js test is sometime broken
index d451307..c43efe4 100644 (file)
@@ -413,6 +413,18 @@ Suites.push({
     ]
 });
 
+function processElmWorkQueue(contentWindow)
+{
+    contentWindow.elmWork();
+    var callbacks = contentWindow.rAFCallbackList;
+    var i = 0;
+    while (i < callbacks.length) {
+        callbacks[i]();
+        i++;
+    }
+    contentWindow.rAFCallbackList = [];
+}
+
 Suites.push({
     name: 'Elm-TodoMVC',
     url: 'todomvc/functional-prog-examples/elm/index.html',
@@ -430,18 +442,23 @@ Suites.push({
                   bubbles: true,
                   cancelable: true
                 }));
+                processElmWorkQueue(contentWindow);
                 triggerEnter(newTodo, 'keydown');
+                processElmWorkQueue(contentWindow);
             }
         }),
         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
             var checkboxes = contentDocument.querySelectorAll('.toggle');
-            for (var i = 0; i < checkboxes.length; i++)
+            for (var i = 0; i < checkboxes.length; i++) {
                 checkboxes[i].click();
+                processElmWorkQueue(contentWindow);
+            }
         }),
         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
-            var deleteButtons = contentDocument.querySelectorAll('.destroy');
-            for (var i = 0; i < deleteButtons.length; i++)
-                deleteButtons[i].click();
+            for (var i = 0; i < numberOfItemsToAdd; i++) {
+                contentDocument.querySelector('.destroy').click();
+                processElmWorkQueue(contentWindow);
+            }
         }),
     ]
 });
index 57b97c5..a55ea9d 100644 (file)
@@ -2678,7 +2678,7 @@ function work()
     }
     setTimeout(work, 0);
 }
-
+window.elmWork = work;
 
 return {
     succeed: succeed,
@@ -7009,9 +7009,7 @@ function on(node)
     };
 }
 
-var rAF = typeof requestAnimationFrame !== 'undefined'
-    ? requestAnimationFrame
-    : function(callback) { callback(); };
+var rAF = function(callback) { callback(); };
 
 function withNode(id, doStuff)
 {
@@ -7485,10 +7483,10 @@ function renderer(parent, tagger, initialVirtualNode)
 }
 
 
-var rAF =
-    typeof requestAnimationFrame !== 'undefined'
-        ? requestAnimationFrame
-        : function(cb) { setTimeout(cb, 1000 / 60); };
+window.rAFCallbackList = [];
+var rAF = function (callback) {
+    window.rAFCallbackList.push(callback);
+}