Bug 1317312 - Tps should filter out glyph cache overhead. r=mconley, a=jcristau
authorGabor Krizsanits <gkrizsanits@mozilla.com>
Tue, 03 Jan 2017 14:00:21 +0100
changeset 353702 773f4844d11b299cce30a516fb73da281cc00c7e
parent 353701 42afdb8f7e6b3e8a465042f64c6c49782f231af4
child 353703 d37e0d774b83e7b0f5355bed6e217c3c6ac03151
push id6795
push userjlund@mozilla.com
push dateMon, 23 Jan 2017 14:19:46 +0000
treeherdermozilla-esr52@76101b503191 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmconley, jcristau
bugs1317312
milestone52.0a2
Bug 1317312 - Tps should filter out glyph cache overhead. r=mconley, a=jcristau
testing/talos/talos/tests/tabswitch/bootstrap.js
testing/talos/talos/tests/tabswitch/install.rdf
testing/talos/talos/tests/tabswitch/tabswitch-signed.xpi
--- a/testing/talos/talos/tests/tabswitch/bootstrap.js
+++ b/testing/talos/talos/tests/tabswitch/bootstrap.js
@@ -152,17 +152,16 @@ function loadTPSContentScript(browser) {
        * Note also that this comment needs to stay inside this comment
        * block. No // comments allowed when serializing JS to content
        * scripts this way.
        */
       let cwu = content.QueryInterface(Ci.nsIInterfaceRequestor)
                        .getInterface(Ci.nsIDOMWindowUtils);
       let lastTransactionId = cwu.lastTransactionId;
       Services.profiler.AddMarker("Content waiting for id > " + lastTransactionId);
-
       addEventListener("MozAfterPaint", function onPaint(event) {
         Services.profiler.AddMarker("Content saw transaction id: " + event.transactionId);
         if (event.transactionId > lastTransactionId) {
           Services.profiler.AddMarker("Content saw correct MozAfterPaint");
           sendAsyncMessage("TPS:ContentSawPaint", {
             time: Date.now().valueOf(),
           });
           removeEventListener("MozAfterPaint", onPaint);
@@ -398,16 +397,28 @@ function test(window) {
     // in an attempt to put the graphics layer into a "steady"
     // state before switching to the next tab.
     initialTab.linkedBrowser.loadURI("about:blank", null, null);
 
     let tabs = gBrowser.getTabsToTheEndFrom(initialTab);
     let times = [];
 
     for (let tab of tabs) {
+      // Let's do an initial run to warm up any paint related caches
+      // (like glyph caches for text). In the next loop we will start with
+      // a GC before each switch so we don't need here.
+      // Note: in case of multiple content processes, closing all the tabs
+      // would close the related content processes, and even if we kept them
+      // alive it would be unlikely that the same pages end up in the same
+      // content processes, so we cannot do this at the manifest level.
+      yield switchToTab(tab);
+      yield switchToTab(initialTab);
+    }
+
+    for (let tab of tabs) {
       yield forceGC(win, tab.linkedBrowser);
       let time = yield switchToTab(tab);
       dump(`${tab.linkedBrowser.currentURI.spec}: ${time}ms\n`);
       times.push(time);
       yield switchToTab(initialTab);
     }
 
     let output = '<!DOCTYPE html>'+
--- a/testing/talos/talos/tests/tabswitch/install.rdf
+++ b/testing/talos/talos/tests/tabswitch/install.rdf
@@ -1,15 +1,15 @@
 <?xml version="1.0"?>
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
   <Description about="urn:mozilla:install-manifest">
     <em:id>tab-switch-test@lassey.us</em:id>
     <em:type>2</em:type>
     <em:name>Tab Switch Test</em:name>
-    <em:version>1.0.2</em:version>
+    <em:version>1.0.3</em:version>
     <em:optionsType>2</em:optionsType>
     <em:optionsURL>chrome://tabswitch/content/options.xul</em:optionsURL>
     <em:bootstrap>true</em:bootstrap>
     <em:description>Measures the performance of switching tabs</em:description>
     <em:creator>Brad Lassey</em:creator>
     <em:multiprocessCompatible>true</em:multiprocessCompatible>
     <!-- Desktop -->
     <em:targetApplication>
index 50b3bb6cb1a1688a53484c44fb0858160428ca6e..cea60112ff1009c1613a4da1f7da59e810294349
GIT binary patch
literal 13350
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