From 568e64dde5e61a7c237c4db2ff8178056c4fc0c4 Mon Sep 17 00:00:00 2001 From: "fmeawad@chromium.org" Date: Tue, 18 Mar 2014 21:27:26 +0000 Subject: [Telemetry] Show V8 metrics in page_cyclers BUG= Review URL: https://codereview.chromium.org/197213022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@257762 0039d316-1c4b-4281-b951-d872f2087c98 --- tools/perf/measurements/page_cycler.py | 6 +++++ tools/perf/measurements/page_cycler_unittest.py | 16 +++++++++++ tools/perf/metrics/v8.py | 36 +++++++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 tools/perf/metrics/v8.py (limited to 'tools/perf') diff --git a/tools/perf/measurements/page_cycler.py b/tools/perf/measurements/page_cycler.py index 01a4628..498cd5d 100644 --- a/tools/perf/measurements/page_cycler.py +++ b/tools/perf/measurements/page_cycler.py @@ -23,6 +23,7 @@ from metrics import iometric from metrics import memory from metrics import power from metrics import speedindex +from metrics import v8 from metrics import v8_object_stats from telemetry.core import util from telemetry.page import page_measurement @@ -38,6 +39,7 @@ class PageCycler(page_measurement.PageMeasurement): self._speedindex_metric = speedindex.SpeedIndexMetric() self._memory_metric = None self._power_metric = power.PowerMetric() + self._v8_metric = v8.V8Metric() self._cpu_metric = None self._v8_object_stats_metric = None self._cold_run_start_index = None @@ -83,6 +85,7 @@ class PageCycler(page_measurement.PageMeasurement): self._speedindex_metric.Start(page, tab) def DidNavigateToPage(self, page, tab): + self._v8_metric.Start(page, tab) self._memory_metric.Start(page, tab) self._power_metric.Start(page, tab) # TODO(qyearsley): Uncomment the following line and move it to @@ -146,8 +149,11 @@ class PageCycler(page_measurement.PageMeasurement): self._has_loaded_page[page.url] += 1 + self._v8_metric.Stop(page, tab) self._power_metric.Stop(page, tab) self._memory_metric.Stop(page, tab) + self._v8_metric.AddResults( + tab, results, chart_name=chart_name_prefix+'times') self._memory_metric.AddResults(tab, results) self._power_metric.AddResults(tab, results) diff --git a/tools/perf/measurements/page_cycler_unittest.py b/tools/perf/measurements/page_cycler_unittest.py index 37f8dc7..be6c6ac 100644 --- a/tools/perf/measurements/page_cycler_unittest.py +++ b/tools/perf/measurements/page_cycler_unittest.py @@ -32,7 +32,21 @@ class MockMemoryMetric(object): def AddSummaryResults(self, tab, results): pass +class MockV8Metric(object): + def __init__(self): + pass + + def Start(self, page, tab): + pass + + def Stop(self, page, tab): + pass + + def AddResults(self, tab, results, chart_name): + pass + +# Used to mock loading a page. class FakePage(object): """Used to mock loading a page.""" def __init__(self, url): @@ -63,6 +77,8 @@ class PageCyclerUnitTest(unittest.TestCase): cycler.ProcessCommandLineArgs(parser, options) cycler.CustomizeBrowserOptions(options) + cycler._v8_metric = MockV8Metric() + if setup_memory_module: # Mock out memory metrics; the real ones require a real browser. mock_memory_metric = MockMemoryMetric() diff --git a/tools/perf/metrics/v8.py b/tools/perf/metrics/v8.py new file mode 100644 index 0000000..7727c63 --- /dev/null +++ b/tools/perf/metrics/v8.py @@ -0,0 +1,36 @@ +# Copyright 2014 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. + +import collections + +from metrics import timeline +from metrics.timeline import TimelineMetric + +class V8Metric(TimelineMetric): + """A metric for measuring V8 functionalities.""" + + def __init__(self): + super(V8Metric, self).__init__(timeline.TRACING_MODE) + self.report_main_thread_only = False + + # Optional argument chart_name is not in base class Metric. + # pylint: disable=W0221 + def AddResults(self, _, results, chart_name=None): + assert self._model + events_by_name = collections.defaultdict(list) + for thread in self.renderer_process.threads.itervalues(): + events = thread.all_slices + + for e in events: + if e.name.startswith('V8'): + events_by_name[e.name].append(e) + + for event_name, event_group in events_by_name.iteritems(): + times = [event.self_time for event in event_group] + total = sum(times) + + # Results objects cannot contain the '.' character, so remove that here. + sanitized_event_name = event_name.replace('.', '_') + + results.Add(sanitized_event_name, 'ms', total, chart_name=chart_name) -- cgit v1.1