Backed out changeset fc352698b470 (bug 1397438) for talos perf-reftest-stylo-disabled-e10s failures.
authorRyan VanderMeulen <ryanvm@gmail.com>
Wed, 20 Sep 2017 22:18:57 -0400
changeset 433993 47f7b6c64265bc7bdd22eef7ab71abc97cf3f8bf
parent 433982 f8dd3f21e434be32fe5901849f1723b0e64cf668
child 433994 6169cd08ca7d5912648e2f640d17d556355eb7a8
child 434089 9699e1cbb1ab3bdba84d7548dcdcd6efca9d1190
push id1567
push userjlorenzo@mozilla.com
push dateThu, 02 Nov 2017 12:36:05 +0000
treeherdermozilla-release@e512c14a0406 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1397438
milestone57.0a1
backs outfc352698b470e0694b87a8cc907b7b482e90e97a
first release with
nightly linux32
47f7b6c64265 / 57.0a1 / 20170921100141 / files
nightly linux64
47f7b6c64265 / 57.0a1 / 20170921100141 / files
nightly mac
47f7b6c64265 / 57.0a1 / 20170921100141 / files
nightly win32
47f7b6c64265 / 57.0a1 / 20170921100141 / files
nightly win64
47f7b6c64265 / 57.0a1 / 20170921100141 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out changeset fc352698b470 (bug 1397438) for talos perf-reftest-stylo-disabled-e10s failures.
testing/talos/talos.json
testing/talos/talos/output.py
testing/talos/talos/pageloader/chrome/pageloader.js
testing/talos/talos/pageloader/install.rdf
testing/talos/talos/pageloader/pageloader-signed.xpi
testing/talos/talos/results.py
testing/talos/talos/run_tests.py
testing/talos/talos/test.py
testing/talos/talos/tests/perf-reftest/.eslintrc.json
testing/talos/talos/tests/perf-reftest/bloom-basic-2.html
testing/talos/talos/tests/perf-reftest/bloom-basic-ref.html
testing/talos/talos/tests/perf-reftest/bloom-basic.html
testing/talos/talos/tests/perf-reftest/bloom_basic.manifest
testing/talos/talos/tests/perf-reftest/bloom_basic_ref.manifest
testing/talos/talos/tests/perf-reftest/coalesce-1.html
testing/talos/talos/tests/perf-reftest/coalesce-ref.html
testing/talos/talos/tests/perf-reftest/perf_reftest.manifest
testing/talos/talos/tests/perf-reftest/util.js
--- a/testing/talos/talos.json
+++ b/testing/talos/talos.json
@@ -65,17 +65,17 @@
         "svgr-e10s": {
             "tests": ["tsvgx", "tsvgr_opacity", "tart", "tscrollx", "tsvg_static"]
         },
         "svgr-stylo-disabled-e10s": {
             "tests": ["tsvgx", "tsvgr_opacity", "tart", "tscrollx", "tsvg_static"],
             "talos_options": ["--disable-stylo"]
         },
         "perf-reftest-e10s": {
-            "tests": ["perf_reftest"]
+            "tests": ["bloom_basic"]
         },
         "perf-reftest-stylo-disabled-e10s": {
             "tests": ["bloom_basic"],
             "talos_options": ["--disable-stylo"]
         },
         "perf-reftest-singletons-e10s": {
             "tests": ["perf_reftest_singletons"]
         },
--- a/testing/talos/talos/output.py
+++ b/testing/talos/talos/output.py
@@ -87,38 +87,34 @@ class Output(object):
                     # override the list of page results for each run
                     result.results = results
 
                 for result in tresults:
                     filtered_results = \
                         result.values(suite['name'],
                                       test.test_config['filters'])
                     vals.extend([[i['value'], j] for i, j in filtered_results])
-                    subtest_index = 0
                     for val, page in filtered_results:
                         if page == 'NULL':
                             # no real subtests
                             page = test.name()
                         subtest = {
                             'name': page,
                             'value': val['filtered'],
                             'replicates': replicates[page],
                         }
                         # if results are from a comparison test i.e. perf-reftest, it will also
                         # contain replicates for 'base' and 'reference'; we wish to keep those
                         # to reference; actual results were calculated as the difference of those
-                        base_runs = result.results[subtest_index].get('base_runs', None)
-                        ref_runs = result.results[subtest_index].get('ref_runs', None)
+                        base_runs = result.results[0].get('base_runs', None)
+                        ref_runs = result.results[0].get('ref_runs', None)
                         if base_runs and ref_runs:
                             subtest['base_replicates'] = base_runs
                             subtest['ref_replicates'] = ref_runs
-
                         subtests.append(subtest)
-                        subtest_index += 1
-
                         if test.test_config.get('lower_is_better') is not None:
                             subtest['lowerIsBetter'] = \
                                 test.test_config['lower_is_better']
                         if test.test_config.get('alert_threshold') is not None:
                             subtest['alertThreshold'] = \
                                 test.test_config['alert_threshold']
                         if test.test_config.get('unit'):
                             subtest['unit'] = test.test_config['unit']
--- a/testing/talos/talos/pageloader/chrome/pageloader.js
+++ b/testing/talos/talos/pageloader/chrome/pageloader.js
@@ -46,17 +46,16 @@ var useMozAfterPaint = false;
 var useFNBPaint = false;
 var gPaintWindow = window;
 var gPaintListener = false;
 var loadNoCache = false;
 var scrollTest = false;
 var gDisableE10S = false;
 var gUseE10S = false;
 var profilingInfo = false;
-var baseVsRef = false;
 
 var isIdleCallbackPending = false;
 
 // when TEST_DOES_OWN_TIMING, we need to store the time from the page as MozAfterPaint can be slower than pageload
 var gTime = -1;
 var gStartTime = -1;
 var gReference = -1;
 
@@ -198,16 +197,17 @@ function plInit() {
     if (startIndex > endIndex) {
       dumpLine("tp: error: startIndex >= endIndex");
       plStop(true);
     }
 
     pages = pages.slice(startIndex, endIndex + 1);
     pageUrls = pages.map(function(p) { return p.url.spec.toString(); });
     report = new Report();
+
     if (doRenderTest)
       renderReport = new Report();
 
     pageIndex = 0;
     if (profilingInfo) {
       TalosParentProfiler.beginTest(getCurrentPageShortName());
     }
 
@@ -395,17 +395,19 @@ function plLoadPage() {
     mm.removeMessageListener("PageLoader:LoadEvent", ContentListener);
     mm.removeMessageListener("PageLoader:RecordTime", ContentListener);
     mm.removeMessageListener("PageLoader:IdleCallbackSet", ContentListener);
     mm.removeMessageListener("PageLoader:IdleCallbackReceived", ContentListener);
     if (useFNBPaint) {
       mm.removeMessageListener("PageLoader:FNBPaintError", ContentListener);
     }
   };
+
   failTimeout.register(loadFail, timeout);
+
   // record which page we are about to open
   TalosParentProfiler.mark("Opening " + pages[pageIndex].url.pathQueryRef);
 
   if (reportRSS) {
     collectMemory(startAndLoadURI, pageName);
   } else {
     startAndLoadURI(pageName);
   }
@@ -558,25 +560,17 @@ function plRecordTime(time) {
   var i = pageIndex
   if (i < pages.length - 1) {
     i++;
   } else {
     i = 0;
   }
   var nextName = pages[i].url.spec;
   if (!recordedName) {
-    // when doing base vs ref type of test, add pre 'base' or 'ref' to reported page name;
-    // this is necessary so that if multiple subtests use same reference page, results for
-    // each ref page run will be kept separate for each base vs ref run, and not grouped
-    // into just one set of results values for everytime that reference page was loaded
-    if (baseVsRef) {
-      recordedName = pages[pageIndex].pre + pageUrls[pageIndex];
-    } else {
-      recordedName = pageUrls[pageIndex];
-    }
+    recordedName = pageUrls[pageIndex];
   }
   if (typeof(time) == "string") {
     var times = time.split(",");
     var names = recordedName.split(",");
     for (var t = 0; t < times.length; t++) {
       if (names.length == 1) {
         report.recordTime(names, times[t]);
       } else {
@@ -894,21 +888,20 @@ function plLoadURLsFromURI(manifestUri) 
     fstream.init(uriFile.file, -1, 0, 0);
   } catch (ex) {
       dumpLine("tp: the file %s doesn't exist" % uriFile.file);
       return null;
   }
 
   var lstream = fstream.QueryInterface(Ci.nsILineInputStream);
 
-  var url_array = [];
+  var d = [];
 
   var lineNo = 0;
   var line = {value: null};
-  var baseVsRefIndex = 0;
   var more;
   do {
     lineNo++;
     more = lstream.readLine(line);
     var s = line.value;
 
     // strip comments (only leading ones)
     s = s.replace(/^#.*/, "");
@@ -916,17 +909,16 @@ function plLoadURLsFromURI(manifestUri) 
     // strip leading and trailing whitespace
     s = s.replace(/^\s*/, "").replace(/\s*$/, "");
 
     if (!s)
       continue;
 
     var flags = 0;
     var urlspec = s;
-    baseVsRefIndex += 1;
 
     // split on whitespace, and figure out if we have any flags
     var items = s.split(/\s+/);
     if (items[0] == "include") {
       if (items.length != 2) {
         dumpLine("tp: Error on line " + lineNo + " in " + manifestUri.spec + ": include must be followed by the manifest to include!");
         return null;
       }
@@ -935,17 +927,17 @@ function plLoadURLsFromURI(manifestUri) 
       if (subManifest == null) {
         dumpLine("tp: invalid URI on line " + manifestUri.spec + ":" + lineNo + " : '" + line.value + "'");
         return null;
       }
 
       var subItems = plLoadURLsFromURI(subManifest);
       if (subItems == null)
         return null;
-      url_array = url_array.concat(subItems);
+      d = d.concat(subItems);
     } else {
       // For scrollTest flag, we accept "normal" pages but treat them as TEST_DOES_OWN_TIMING
       // together with EXECUTE_SCROLL_TEST which makes us run the scroll test on load.
       // We do this by artificially "injecting" the TEST_DOES_OWN_TIMING flag ("%") to the item
       // and then let the default flow for this flag run without further modifications
       // (other than calling the scroll test once the page is loaded).
       // Note that if we have the scrollTest flag but the item already has "%", then we do
       // nothing (the scroll test will not execute, and the page will report with its
@@ -955,68 +947,32 @@ function plLoadURLsFromURI(manifestUri) 
         flags |= EXECUTE_SCROLL_TEST;
       }
 
       if (items.length == 2) {
         if (items[0].indexOf("%") != -1)
           flags |= TEST_DOES_OWN_TIMING;
 
         urlspec = items[1];
-      } else if (items.length == 3) {
-        // base vs ref type of talos test
-        // expect each manifest line to be in the format of:
-        // & http://localhost/tests/perf-reftest/base-page.html, http://localhost/tests/perf-reftest/reference-page.html
-        // test will run with the base page, then with the reference page; and ultimately the actual test results will
-        // be the comparison values of those two pages; more than one line will result in base vs ref subtests
-        if (items[0].indexOf("&") != -1) {
-          baseVsRef = true;
-          flags |= TEST_DOES_OWN_TIMING;
-          // for the base, must remove the comma on the end of the actual url
-          var urlspecBase = items[1].slice(0, -1);
-          var urlspecRef = items[2];
-        } else {
-          dumpLine("tp: Error on line " + lineNo + " in " + manifestUri.spec + ": unknown manifest format!");
-          return null;
-        }
       } else if (items.length != 1) {
         dumpLine("tp: Error on line " + lineNo + " in " + manifestUri.spec + ": whitespace must be %-escaped!");
         return null;
       }
 
-      var url;
-
-      if (!baseVsRef) {
-        url = gIOS.newURI(urlspec, null, manifestUri);
-
-        if (pageFilterRegexp && !pageFilterRegexp.test(url.spec))
-          continue;
+      var url = gIOS.newURI(urlspec, null, manifestUri);
 
-        url_array.push({ url, flags });
-      } else {
-        // base vs ref type of talos test
-        // we add a 'pre' prefix here indicating that this particular page is a base page or a reference
-        // page; later on this 'pre' is used when recording the actual time value/result; because in
-        // the results we use the url as the results key; but we might use the same test page as a reference
-        // page in the same test suite, so we need to add a prefix so this results key is always unique
-        url = gIOS.newURI(urlspecBase, null, manifestUri);
-        if (pageFilterRegexp && !pageFilterRegexp.test(url.spec))
-          continue;
-        var pre = "base_page_" + baseVsRefIndex + "_";
-        url_array.push({ url, flags, pre });
+      if (pageFilterRegexp && !pageFilterRegexp.test(url.spec))
+        continue;
 
-        url = gIOS.newURI(urlspecRef, null, manifestUri);
-        if (pageFilterRegexp && !pageFilterRegexp.test(url.spec))
-          continue;
-        pre = "ref_page_" + baseVsRefIndex + "_";
-        url_array.push({ url, flags, pre });
-      }
+      d.push({   url,
+               flags });
     }
   } while (more);
 
-  return url_array;
+  return d;
 }
 
 function dumpLine(str) {
   if (MozillaFileLogger && MozillaFileLogger._foStream)
     MozillaFileLogger.log(str + "\n");
   dump(str);
   dump("\n");
 }
--- a/testing/talos/talos/pageloader/install.rdf
+++ b/testing/talos/talos/pageloader/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>pageloader@mozilla.org</em:id>
-    <em:version>1.0.29</em:version>
+    <em:version>1.0.27</em:version>
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>44.0</em:minVersion>
         <em:maxVersion>*</em:maxVersion>
       </Description>
     </em:targetApplication>
     <!-- Front End MetaData -->
index 41d7a39d83fc428b9c3a3e018159cd0345a34430..2c2526e3c9c8b59b88b649908a88a39ef7584b2a
GIT binary patch
literal 31107
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
Zrw=7raEO0=0OhaO@?SkK!}TAv{|ECBeP93p
--- a/testing/talos/talos/results.py
+++ b/testing/talos/talos/results.py
@@ -248,22 +248,17 @@ class PageloaderResults(Results):
             self.results.append(result)
 
     def format_pagename(self, page):
         """
         fix up the page for reporting
         """
         page = page.rstrip('/')
         if '/' in page:
-            if 'base_page' in page or 'ref_page' in page:
-                # for base vs ref type test, the page name is different format, i.e.
-                # base_page_1_http://localhost:53309/tests/perf-reftest/bloom-basic.html
-                page = page.split('/')[-1]
-            else:
-                page = page.split('/')[0]
+            page = page.split('/')[0]
         return page
 
 
 class BrowserLogResults(object):
     """parse the results from the browser log output"""
 
     # tokens for the report types
     report_tokens = [
--- a/testing/talos/talos/run_tests.py
+++ b/testing/talos/talos/run_tests.py
@@ -336,55 +336,39 @@ def make_comparison_result(base_and_refe
     results object with the comparison results, that will look like traditional single test results
     like this:
 
     PERFHERDER_DATA: {"framework": {"name": "talos"}, "suites": [{"lowerIsBetter": true,
     "subtests": [{"name": "", "lowerIsBetter": true, "alertThreshold": 5.0, "replicates":
     [16.705, ...], "value": 16.705, "unit": "ms"}], "extraOptions": ["e10s"], "name":
     "bloom_basic", "alertThreshold": 5.0}]}
     '''
+    # separate the 'base' and 'reference' result run values
+    base_result_runs = base_and_reference_results.results[0].results[0]['runs']
+    ref_result_runs = base_and_reference_results.results[0].results[1]['runs']
+
     # create a new results object for the comparison result; keep replicates from both pages
     comparison_result = copy.deepcopy(base_and_reference_results)
 
     # remove original results from our copy as they will be replaced by one comparison result
     comparison_result.results[0].results = []
-    comp_results = comparison_result.results[0].results
-
-    # zero-based count of how many base vs reftest sets we have
-    subtest_index = 0
-
-    # each set of two results is actually a base test followed by the
-    # reference test; we want to go through each set of base vs reference
-    for x in range(0, len(base_and_reference_results.results[0].results), 2):
-
-        # separate the 'base' and 'reference' result run values
-        results = base_and_reference_results.results[0].results
-        base_result_runs = results[x]['runs']
-        ref_result_runs = results[x + 1]['runs']
 
-        # the test/subtest result is the difference between the base vs reference test page
-        # values; for this result use the base test page name for the subtest/test name
-        sub_test_name = base_and_reference_results.results[0].results[x]['page']
+    # populate our new comparison result with 'base' and 'ref' replicates
+    comparison_result.results[0].results.append({'index': 0,
+                                                 'runs': [],
+                                                 'page': '',
+                                                 'base_runs': base_result_runs,
+                                                 'ref_runs': ref_result_runs})
 
-        # populate our new comparison result with 'base' and 'ref' replicates
-        comp_results.append({'index': 0,
-                             'runs': [],
-                             'page': sub_test_name,
-                             'base_runs': base_result_runs,
-                             'ref_runs': ref_result_runs})
-
-        # now step thru each result, compare 'base' vs 'ref', and store the difference in 'runs'
-        _index = 0
-        for next_ref in comp_results[subtest_index]['ref_runs']:
-            diff = abs(next_ref - comp_results[subtest_index]['base_runs'][_index])
-            comp_results[subtest_index]['runs'].append(round(diff, 3))
-            _index += 1
-
-        # increment our base vs reference subtest index
-        subtest_index += 1
+    # now step thru each result, compare 'base' vs 'ref', and store the difference in 'runs'
+    _index = 0
+    for next_ref in comparison_result.results[0].results[0]['ref_runs']:
+        diff = abs(next_ref - comparison_result.results[0].results[0]['base_runs'][_index])
+        comparison_result.results[0].results[0]['runs'].append(round(diff, 3))
+        _index += 1
 
     return comparison_result
 
 
 def convert_to_separate_test_results(multi_value_result, test_event_map):
     ''' Receive a test result that actually contains multiple values in a single iteration, and
     parse it out in order to 'fake' three seprate test results.
 
--- a/testing/talos/talos/test.py
+++ b/testing/talos/talos/test.py
@@ -802,24 +802,24 @@ class a11yr(PageloaderTest):
     tpmozafterpaint = True
     tpchrome = False
     preferences = {'dom.send_after_paint_to_content': False}
     unit = 'ms'
     alert_threshold = 5.0
 
 
 @register_test()
-class perf_reftest(PageloaderTest):
+class bloom_basic(PageloaderTest):
     """
-    Style perf-reftest a set of tests where the result is the difference of base vs ref pages
+    Stylo bloom_basic: runs bloom_basic and bloom_basic_ref and reports difference
     """
     base_vs_ref = True  # compare the two test pages with eachother and report comparison
-    tpmanifest = '${talos}/tests/perf-reftest/perf_reftest.manifest'
+    tpmanifest = '${talos}/tests/perf-reftest/bloom_basic.manifest'
     tpcycles = 1
-    tppagecycles = 10
+    tppagecycles = 25
     gecko_profile_interval = 1
     gecko_profile_entries = 2000000
     filters = filter.ignore_first.prepare(5) + filter.median.prepare()
     unit = 'ms'
     lower_is_better = True
     alert_threshold = 5.0
 
 
deleted file mode 100644
--- a/testing/talos/talos/tests/perf-reftest/.eslintrc.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "rules": {
-        "no-undef": "off"
-    }
-}
-
deleted file mode 100644
--- a/testing/talos/talos/tests/perf-reftest/bloom-basic-2.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <script src="util.js"></script>
-    <script>
-window.onload = function() {
-  /* Use many rules, instead of one rule with many selectors, to test per-rule overhead. */
-  document.head.appendChild(build_rule("caption div, caption span", 1, "{ color: blue; } ", 20000));
-  let dom = build_dom(5000, "div");
-
-  flush_style();
-  perf_start();
-  document.body.appendChild(dom);
-  flush_style(dom);
-  perf_finish();
-}
-    </script>
-  </head>
-  <body>
-  </body>
-</html>
--- a/testing/talos/talos/tests/perf-reftest/bloom-basic-ref.html
+++ b/testing/talos/talos/tests/perf-reftest/bloom-basic-ref.html
@@ -1,20 +1,34 @@
 <!DOCTYPE html>
 <html>
   <head>
     <script src="util.js"></script>
+    <script src="chrome://talos-powers-content/content/TalosContentProfiler.js"></script>
     <script>
+/* import-globals-from util.js */
 window.onload = function() {
-  document.head.appendChild(build_rule("caption > div, caption > span", 20000, "{ color: blue; } "));
+  document.head.appendChild(build_rule("span > div", 10000, "{ color: blue; } "));
   let dom = build_dom(5000, "div");
 
-  flush_style();
-  perf_start();
-  document.body.appendChild(dom);
-  flush_style(dom);
-  perf_finish();
+  TalosContentProfiler.resume("bloom_basic_ref start", true).then(() => {
+    let start = performance.now();
+    document.body.appendChild(dom);
+    window.foo = window.getComputedStyle(document.body).color;
+    let end = performance.now();
+
+    TalosContentProfiler.pause("bloom_basic_ref finish", true).then(() => {
+      // when running in talos report results; when running outside talos just alert
+      if (window.tpRecordTime) {
+        window.tpRecordTime(end - start, start);
+      } else {
+        console.log(end);
+        console.log(start);
+        alert("Result: " + (end - start).toFixed(2) + " (ms)");
+      }
+    });
+  });
 }
     </script>
   </head>
   <body>
   </body>
 </html>
--- a/testing/talos/talos/tests/perf-reftest/bloom-basic.html
+++ b/testing/talos/talos/tests/perf-reftest/bloom-basic.html
@@ -1,20 +1,34 @@
 <!DOCTYPE html>
 <html>
   <head>
     <script src="util.js"></script>
+    <script src="chrome://talos-powers-content/content/TalosContentProfiler.js"></script>
     <script>
+/* import-globals-from util.js */
 window.onload = function() {
-  document.head.appendChild(build_rule("caption div, caption span", 20000, "{ color: blue; } "));
+  document.head.appendChild(build_rule("span div", 10000, "{ color: blue; } "));
   let dom = build_dom(5000, "div");
 
-  flush_style();
-  perf_start();
-  document.body.appendChild(dom);
-  flush_style(dom);
-  perf_finish();
+  TalosContentProfiler.resume("bloom_basic start", true).then(() => {
+    let start = performance.now();
+    document.body.appendChild(dom);
+    window.foo = window.getComputedStyle(document.body).color;
+    let end = performance.now();
+
+    TalosContentProfiler.pause("bloom_basic end", true).then(() => {
+      // when running in talos report results; when running outside talos just alert
+      if (window.tpRecordTime) {
+        window.tpRecordTime(end - start, start);
+      } else {
+        console.log(end);
+        console.log(start);
+        alert("Result: " + (end - start).toFixed(2) + " (ms)");
+      }
+    });
+  });
 }
     </script>
   </head>
   <body>
   </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/talos/talos/tests/perf-reftest/bloom_basic.manifest
@@ -0,0 +1,4 @@
+# base_vs_ref is set in test.py for this test, so each of these pages are run as separate
+# tests, but then compared against eachother; and the reported results are the comparison
+% http://localhost/tests/perf-reftest/bloom-basic.html
+% http://localhost/tests/perf-reftest/bloom-basic-ref.html
new file mode 100644
--- /dev/null
+++ b/testing/talos/talos/tests/perf-reftest/bloom_basic_ref.manifest
@@ -0,0 +1,1 @@
+% http://localhost/tests/perf-reftest/bloom-basic-ref.html
deleted file mode 100644
--- a/testing/talos/talos/tests/perf-reftest/coalesce-1.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<style>
-.x { color: yellow; }
-</style>
-<script src="util.js"></script>
-<script>
-function set_class(n) {
-  n.className = "x";
-  n = n.firstChild;
-  while (n) {
-    set_class(n);
-    n = n.nextSibling;
-  }
-}
-window.onload = function() {
-  let root = build_dom(50000, "div");
-  document.body.appendChild(root);
-  flush_style(root);
-  perf_start();
-  set_class(root);
-  flush_style(root);
-  perf_finish();
-};
-</script>
-<body></body>
deleted file mode 100644
--- a/testing/talos/talos/tests/perf-reftest/coalesce-ref.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<style>
-.x, .x * { color: yellow; }
-</style>
-<script src="util.js"></script>
-<script>
-window.onload = function() {
-  let root = build_dom(50000, "div");
-  document.body.appendChild(root);
-  flush_style(root);
-  root.className = "x";
-  perf_start();
-  flush_style(root);
-  perf_finish();
-};
-</script>
-<body></body>
deleted file mode 100644
--- a/testing/talos/talos/tests/perf-reftest/perf_reftest.manifest
+++ /dev/null
@@ -1,6 +0,0 @@
-# base_vs_ref is set in test.py for this test, so each of these lines is the base vs ref test pag
-# both pages are run and then the results compared, the ultimate reported results are the comparisons.
-# Each line is reported as a subtest like the other talos tests that have multiple lines of URLs.
-& http://localhost/tests/perf-reftest/bloom-basic.html, http://localhost/tests/perf-reftest/bloom-basic-ref.html
-& http://localhost/tests/perf-reftest/bloom-basic-2.html, http://localhost/tests/perf-reftest/bloom-basic-ref.html
-& http://localhost/tests/perf-reftest/coalesce-1.html, http://localhost/tests/perf-reftest/coalesce-ref.html
--- a/testing/talos/talos/tests/perf-reftest/util.js
+++ b/testing/talos/talos/tests/perf-reftest/util.js
@@ -1,82 +1,17 @@
-var perf_data = {
-  start: null,
-  end: null,
-}
-
-function build_dom(n, elemName, options) {
-  // By default we use different elements in the DOM to defeat the style sharing
-  // cache, otherwise this sythetic DOM is trivially stylable by engines with that
-  // optimization.
-  options = options || {};
-  var elemNameLeft = options.elemNameLeft || "div";
-  var elemNameRight = options.elemNameRight || "span";
-
+function build_dom(n, elemName) {
   var ours = document.createElement(elemName);
-  for (var attr in options.attributes) {
-    ours.setAttribute(attr, options.attributes[attr]);
-  }
-
   if (n != 1) {
     var leftSize = Math.floor(n / 2);
     var rightSize = Math.floor((n - 1) / 2);
-    ours.appendChild(build_dom(leftSize, elemNameLeft, options));
+    ours.appendChild(build_dom(leftSize, elemName));
     if (rightSize > 0)
-      ours.appendChild(build_dom(rightSize, elemNameRight, options));
+      ours.appendChild(build_dom(rightSize, elemName));
   }
   return ours;
 }
 
-function build_rule(selector, selectorRepeat, declaration, ruleRepeat) {
-  ruleRepeat = ruleRepeat || 1;
+function build_rule(selector, selectorRepeat, declaration) {
   var s = document.createElement("style");
-  var rule = Array(selectorRepeat).fill(selector).join(", ") + declaration;
-  s.textContent = Array(ruleRepeat).fill(rule).join("\n\n");
+  s.textContent = Array(selectorRepeat).fill(selector).join(", ") + declaration;
   return s;
 }
-
-function flush_style(element) {
-  getComputedStyle(element || document.documentElement).color;
-}
-
-function perf_start() {
-  if (perf_data.start !== null) {
-    throw "already started timing!";
-  }
-
-  perf_data.start = performance.now();
-}
-
-function perf_finish() {
-  var end = performance.now();
-
-  if (perf_data.start === null) {
-    throw "haven't started timing!";
-  }
-
-  if (perf_data.end !== null) {
-    throw "already finished timing!";
-  }
-
-  var start = perf_data.start;
-  perf_data.end = end;
-
-  // when running in talos report results; when running outside talos just alert
-  if (window.tpRecordTime) {
-    // Running in talos.
-    window.tpRecordTime(end - start, start);
-  } else if (window.parent && window.parent.report_perf_reftest_time) {
-    // Running in the perf-reftest runner.
-    window.parent.report_perf_reftest_time({ type: "time", value: end - start });
-  } else {
-    // Running standalone; just alert.
-    console.log(end);
-    console.log(start);
-    alert("Result: " + (end - start).toFixed(2) + " (ms)");
-  }
-}
-
-if (window.parent.report_perf_reftest_time) {
-  window.addEventListener("error", function(e) {
-    window.parent.report_perf_reftest_time({ type: "error", value: e.message });
-  });
-}