Index: tools/telemetry/telemetry/web_perf/metrics/startup.py |
diff --git a/tools/telemetry/telemetry/web_perf/metrics/startup.py b/tools/telemetry/telemetry/web_perf/metrics/startup.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..18025dfc01fca69e4c6b4af9fc0b816685821105 |
--- /dev/null |
+++ b/tools/telemetry/telemetry/web_perf/metrics/startup.py |
@@ -0,0 +1,95 @@ |
+# Copyright 2015 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 telemetry import value |
+from telemetry.web_perf.metrics import timeline_based_metric |
+ |
+_PROCESS_CREATION = 'Startup.BrowserProcessCreation' |
+_MAIN_ENTRY_POINT = 'Startup.BrowserMainEntryPoint' |
+ |
+# A dictionary that maps metric names to a value, which can be either of |
+# the two: |
+# 1. A tuple of one event name if the event itself contains reported duration |
+# 2. A tuple of two event names if the value to report is the time difference |
+# between starting these events |
+_METRICS = { |
+ 'messageloop_start_time': |
+ ('Startup.BrowserMessageLoopStartTimeFromMainEntry',), |
+ |
+ 'window_display_time': |
+ ('Startup.BrowserWindowDisplay',), |
+ |
+ 'open_tabs_time': |
+ ('Startup.BrowserOpenTabs',), |
+ |
+ 'first_non_empty_paint_time': |
+ ('Startup.FirstWebContents.NonEmptyPaint2',), |
+ |
+ 'first_main_frame_load_time': |
+ ('Startup.FirstWebContents.MainFrameLoad2',), |
+ |
+ 'foreground_tab_load_complete': |
+ (_MAIN_ENTRY_POINT, 'loadEventEnd'), |
+ |
+ # TODO(gabadie): Implement foreground_tab_request_start between |
+ # _MAIN_ENTRY_POINT and 'requestStart' once crbug.com/552472 fixed. |
+} |
+ |
+_TRACKED_EVENT_NAMES = set() |
+for i in _METRICS.values(): |
+ _TRACKED_EVENT_NAMES.add(i[0]) |
+ if len(i) == 2: |
+ _TRACKED_EVENT_NAMES.add(i[1]) |
+ |
+ |
+class StartupTimelineMetric(timeline_based_metric.TimelineBasedMetric): |
+ """Reports summary stats from important startup events.""" |
+ |
+ def __init__(self): |
+ super(StartupTimelineMetric, self).__init__() |
+ |
+ def AddResults(self, model, _renderer_thread, interactions, results): |
+ pass |
+ |
+ def AddWholeTraceResults(self, model, results): |
+ browser = model.browser_process |
+ |
+ if not browser: |
+ return |
+ |
+ # Produce a map of events to track. |
+ tracked_events = {} |
+ for event in browser.parent.IterAllEvents( |
+ event_predicate=lambda event: event.name in _TRACKED_EVENT_NAMES): |
+ # In case of a begin/end trace event, only track the begin that contain |
+ # the duration. |
+ if event.name in tracked_events: |
+ continue |
+ |
+ tracked_events[event.name] = event |
+ |
+ # Generate the metric values according to the tracked events. |
+ for display_name, event_names in _METRICS.iteritems(): |
+ if event_names[0] not in tracked_events: |
+ continue |
+ |
+ duration = None |
+ if len(event_names) == 1: |
+ # The single event contains the duration to report. |
+ duration = tracked_events[event_names[0]].duration |
+ |
+ elif len(event_names) == 2: |
+ # The duration is defined as the difference between two event starts. |
+ if event_names[1] not in tracked_events: |
+ continue |
+ |
+ duration = (tracked_events[event_names[1]].start - |
+ tracked_events[event_names[0]].start) |
+ |
+ results.AddValue(value.scalar.ScalarValue( |
+ page=results.current_page, |
+ name=display_name, |
+ units='ms', |
+ value=duration, |
+ improvement_direction=value.improvement_direction.DOWN)) |