Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(466)

Unified Diff: tools/telemetry/telemetry/page_benchmark_results.py

Issue 11779041: [telemetry] Add support for BenchmarkResults that vary from page to page (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nitfix Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/telemetry/telemetry/page_benchmark_results.py
diff --git a/tools/telemetry/telemetry/page_benchmark_results.py b/tools/telemetry/telemetry/page_benchmark_results.py
new file mode 100644
index 0000000000000000000000000000000000000000..4b52b6fd4ffbe2a03af487fc490cbd125ae5e3a4
--- /dev/null
+++ b/tools/telemetry/telemetry/page_benchmark_results.py
@@ -0,0 +1,128 @@
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+from collections import defaultdict
+from telemetry.page_test import PageTestResults
+from telemetry.perf_tests_helper import PrintPerfResult
+from telemetry.page_benchmark_value import PageBenchmarkValue
+
+class ValuesForSinglePage(object):
+ def __init__(self, page):
+ self.page = page
+ self.values = []
+
+ def AddValue(self, value):
+ self.values.append(value)
+
+ @property
+ def measurement_names(self):
+ return [value.measurement_name for value in self.values]
+
+ def FindValueByMeasurementName(self, measurement_name):
+ values = [value for value in self.values
+ if value.measurement_name == measurement_name]
+ assert len(values) <= 1
+ if len(values):
+ return values[0]
+ return None
+
+class PageBenchmarkResults(PageTestResults):
+ def __init__(self):
+ super(PageBenchmarkResults, self).__init__()
+ self._all_values_for_all_pages = []
+
+ self._all_measurements_that_have_been_seen = {}
+
+ self._values_for_current_page = {}
+
+ @property
+ def values_for_current_page(self):
+ return self._values_for_current_page
+
+ @property
+ def all_values_for_all_pages(self):
+ return self._all_values_for_all_pages
+
+ def WillMeasurePage(self, page):
+ self._values_for_current_page = ValuesForSinglePage(page)
+
+ @property
+ def all_measurements_that_have_been_seen(self):
+ return self._all_measurements_that_have_been_seen
+
+ def Add(self, trace_name, units, value, chart_name=None, data_type='default'):
+ value = PageBenchmarkValue(trace_name, units, value, chart_name, data_type)
+ measurement_name = value.measurement_name
+
+ # Sanity checks.
+ assert measurement_name != 'url', 'The name url cannot be used'
+ if measurement_name in self._all_measurements_that_have_been_seen:
+ measurement_data = \
+ self._all_measurements_that_have_been_seen[measurement_name]
+ last_seen_units = measurement_data['units']
+ last_seen_data_type = measurement_data['type']
+ assert last_seen_units == units, \
+ 'Unit cannot change for a name once it has been provided'
+ assert last_seen_data_type == data_type, \
+ 'Unit cannot change for a name once it has been provided'
+ else:
+ self._all_measurements_that_have_been_seen[measurement_name] = {
+ 'units': units,
+ 'type': data_type}
+
+ self._values_for_current_page.AddValue(value)
+
+ def DidMeasurePage(self):
+ assert self._values_for_current_page, 'Failed to call WillMeasurePage'
+ self._all_values_for_all_pages.append(self._values_for_current_page)
+ self._values_for_current_page = None
+
+ def _PrintPerfResult(self, measurement, trace, values, units,
+ result_type='default'):
+ PrintPerfResult(measurement, trace, values, units, result_type)
+
+ def PrintSummary(self, trace_tag):
+ if self.page_failures:
+ return
+
+ # Build the results summary.
+ results_summary = defaultdict(list)
+ for measurement_name in \
+ self._all_measurements_that_have_been_seen.iterkeys():
+ for page_values in self._all_values_for_all_pages:
+ value = page_values.FindValueByMeasurementName(measurement_name)
+ if not value:
+ continue
+ measurement_units_type = (measurement_name,
+ value.units,
+ value.data_type)
+ value_url = (value.output_value, page_values.page.url)
+ results_summary[measurement_units_type].append(value_url)
+
+ # Output the results summary sorted by name, then units, then data type.
+ for measurement_units_type, value_url_list in sorted(
+ results_summary.iteritems()):
+ measurement, units, data_type = measurement_units_type
+
+ if data_type == 'histogram':
+ # For histograms, the _by_url data is important.
+ by_url_data_type = 'histogram'
+ else:
+ # For non-histograms, the _by_url data is unimportant.
+ by_url_data_type = 'unimportant'
+ if '.' in measurement:
+ measurement, trace = measurement.split('.', 1)
+ trace += (trace_tag or '')
+ else:
+ trace = measurement + (trace_tag or '')
+
+ if not trace_tag:
+ for value, url in value_url_list:
+ self._PrintPerfResult(measurement + '_by_url', url, [value], units,
+ by_url_data_type)
+
+ # For histograms, we don't print the average data, only the _by_url.
+ if not data_type == 'histogram':
+ values = [i[0] for i in value_url_list]
+ self._PrintPerfResult(measurement, trace, values, units, data_type)
+
« no previous file with comments | « tools/telemetry/telemetry/multi_page_benchmark_runner.py ('k') | tools/telemetry/telemetry/page_benchmark_results_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698