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..1c9d638eaa3db1cc646eb5785ae8034e99196522 |
--- /dev/null |
+++ b/tools/telemetry/telemetry/web_perf/metrics/startup.py |
@@ -0,0 +1,105 @@ |
+# 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' |
+ |
+# Map of all startup metric's values's to the trace events. |
eakuefner
2015/11/17 16:51:52
I think this is fine without the comment.
gabadie
2015/11/17 18:14:23
Done.
|
+_METRICS = { |
+ # "display_name": |
+ # ("starting mark event's name", "ending mark event's name"), |
+ #OR ("begin/end event's name"), |
+ |
+ '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): once 552472 fixed, enable this code |
+ # 'foreground_tab_request_start': |
+ # (_MAIN_ENTRY_POINT, 'requestStart'), |
+} |
+ |
+# List of all event names to track. |
+_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. |
+ |
+ At startup time, there are several events within it that are interesting to |
+ track Chrome's performance. |
+ """ |
+ |
+ 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 |
+ |
+ # Maps all the events we are interested in. |
+ 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 |
+ |
+ # Generates 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: |
+ # If len(event_names) == 1, then it means we are using a begin/end |
+ # trace event, therefor we directly fetch the duration of this event. |
+ duration = tracked_events[event_names[0]].duration |
+ |
+ elif len(event_names) == 2: |
+ # If len(event_names) == 1, then it means we are using two instant/mark |
+ # trace events, therefor we manually diff the timestamps. |
+ if event_names[1] not in tracked_events: |
+ continue |
+ |
+ duration = (tracked_events[event_names[1]].start - |
+ tracked_events[event_names[0]].start) |
+ |
+ assert duration != None, 'something is wrong in _METRICS' |
+ |
+ results.AddValue(value.scalar.ScalarValue( |
+ page=results.current_page, |
+ name=display_name, |
+ units='ms', |
+ value=duration, |
+ improvement_direction=value.improvement_direction.DOWN)) |