Chromium Code Reviews| Index: tools/telemetry/telemetry/web_perf/timeline_based_measurement.py |
| diff --git a/tools/telemetry/telemetry/web_perf/timeline_based_measurement.py b/tools/telemetry/telemetry/web_perf/timeline_based_measurement.py |
| index 136db6624afbac771ac6b8ebe815b8738a746604..710bb7d6bbbcd861be807cb135c49d26967b9a18 100644 |
| --- a/tools/telemetry/telemetry/web_perf/timeline_based_measurement.py |
| +++ b/tools/telemetry/telemetry/web_perf/timeline_based_measurement.py |
| @@ -111,36 +111,63 @@ class _TimelineBasedMetrics(object): |
| interactions, wrapped_results) |
| -class TimelineBasedMeasurement(page_test.PageTest): |
| - """Collects multiple metrics pages based on their interaction records. |
| +class Options(object): |
| + """A class to be used to configure TimelineBasedMeasurement. |
| - A timeline measurement shifts the burden of what metrics to collect onto the |
| - page under test, or the pageset running that page. Instead of the measurement |
| - having a fixed set of values it collects about the page, the page being tested |
| + This is created and returned by |
| + Benchmark.CreateTimelineBasedMeasurementOptions. |
| + """ |
| + |
| + def __init__(self, overhead_level=NO_OVERHEAD_LEVEL): |
| + """Save the overhead level. |
| + |
| + As the amount of instrumentation increases, so does the overhead. |
| + The user of the measurement chooses the overhead level that is appropriate, |
| + and the tracing is filtered accordingly. |
| + |
| + overhead_level: one of NO_OVERHEAD_LEVEL, V8_OVERHEAD_LEVEL, |
| + MINIMAL_OVERHEAD_LEVEL, or DEBUG_OVERHEAD_LEVEL. |
| + The v8 overhead level is a temporary solution that may be removed. |
| + """ |
| + self._overhead_level = overhead_level |
| + |
| + |
| +class TimelineBasedMeasurement(object): |
| + """Collects multiple metrics based on their interaction records. |
| + |
| + A timeline based measurement shifts the burden of what metrics to collect onto |
| + the user story under test. Instead of the measurement |
| + having a fixed set of values it collects, the user story being tested |
| issues (via javascript) an Interaction record into the user timing API that |
| - describing what the page is doing at that time, as well as a standardized set |
| + describing what is happening at that time, as well as a standardized set |
| of flags describing the semantics of the work being done. The |
| TimelineBasedMeasurement object collects a trace that includes both these |
| - interaction recorsd, and a user-chosen amount of performance data using |
| + interaction records, and a user-chosen amount of performance data using |
| Telemetry's various timeline-producing APIs, tracing especially. |
| It then passes the recorded timeline to different TimelineBasedMetrics based |
| - on those flags. This allows a single run through a page to produce load timing |
| - data, smoothness data, critical jank information and overall cpu usage |
| - information. |
| + on those flags. As an example, this allows a single user story run to produce |
| + load timing data, smoothness data, critical jank information and overall cpu |
| + usage information. |
| For information on how to mark up a page to work with |
| TimelineBasedMeasurement, refer to the |
| perf.metrics.timeline_interaction_record module. |
| - |
| """ |
| - def __init__(self, overhead_level=NO_OVERHEAD_LEVEL): |
| - super(TimelineBasedMeasurement, self).__init__('RunPageInteractions') |
| - self._overhead_level = overhead_level |
| - |
| - def WillNavigateToPage(self, page, tab): |
| - if not tab.browser.platform.tracing_controller.IsChromeTracingSupported( |
| - tab.browser): |
| + def __init__(self, options): |
| + self._overhead_level = options._overhead_level |
| + |
| + def StartTracing(self, app, synthetic_delay_categories=None): |
|
nednguyen
2014/12/19 01:16:21
s/StartTracing/WillRunTest
also
s/StopTracing/DidR
slamm
2015/01/02 23:47:20
Done.
|
| + """Configure and start tracing. |
| + |
| + Args: |
| + app: an app.App subclass instance. |
| + synthetic_delay_categories: iterable of delays. For example: |
| + ['DELAY(cc.BeginMainFrame;0.014;alternating)'] |
| + where 'cc.BeginMainFrame' is a timeline event, 0.014 is the delay, |
| + and 'alternating' is the mode. |
| + """ |
| + if not app.platform.tracing_controller.IsChromeTracingSupported(app): |
| raise Exception('Not supported') |
| assert self._overhead_level in ALL_OVERHEAD_LEVELS |
| @@ -156,23 +183,45 @@ class TimelineBasedMeasurement(page_test.PageTest): |
| else: |
| category_filter = tracing_category_filter.CreateDebugOverheadFilter() |
| - for delay in page.GetSyntheticDelayCategories(): |
| + # TODO(slamm): Move synthetic_delay_categories to the TBM options. |
| + for delay in synthetic_delay_categories or []: |
| category_filter.AddSyntheticDelay(delay) |
| options = tracing_options.TracingOptions() |
| options.enable_chrome_trace = True |
| - tab.browser.platform.tracing_controller.Start(options, category_filter) |
| + app.platform.tracing_controller.Start(options, category_filter) |
| - def ValidateAndMeasurePage(self, page, tab, results): |
| - """ Collect all possible metrics and added them to results. """ |
| - trace_result = tab.browser.platform.tracing_controller.Stop() |
| + def Measure(self, app, renderer_thread_tab_id, results): |
| + """Collect all possible metrics and added them to results.""" |
| + trace_result = app.platform.tracing_controller.Stop() |
| results.AddValue(trace.TraceValue(results.current_page, trace_result)) |
| model = model_module.TimelineModel(trace_result) |
| - renderer_thread = model.GetRendererThreadFromTabId(tab.id) |
| + renderer_thread = model.GetRendererThreadFromTabId(renderer_thread_tab_id) |
| meta_metrics = _TimelineBasedMetrics( |
| model, renderer_thread, _GetMetricFromMetricType) |
| meta_metrics.AddResults(results) |
| + def StopTracing(self, app): |
| + if app.platform.tracing_controller.is_tracing_running: |
| + app.platform.tracing_controller.Stop() |
| + |
| + |
| +class TimelineBasedPageTest(page_test.PageTest): |
| + """Page test that collects metrics with TimelineBasedMeasurement.""" |
| + def __init__(self, tbm): |
| + super(TimelineBasedPageTest, self).__init__('RunPageInteractions') |
| + self._measurement = tbm |
| + |
| + @property |
| + def measurement(self): |
| + return self._measurement |
| + |
| + def WillNavigateToPage(self, page, tab): |
| + self._measurement.StartTracing( |
| + tab.browser, page.GetSyntheticDelayCategories()) |
| + |
| + def ValidateAndMeasurePage(self, page, tab, results): |
| + """Collect all possible metrics and added them to results.""" |
| + self._measurement.Measure(tab.browser, tab.id, results) |
| def CleanUpAfterPage(self, page, tab): |
| - if tab.browser.platform.tracing_controller.is_tracing_running: |
| - tab.browser.platform.tracing_controller.Stop() |
| + self._measurement.StopTracing(tab.browser) |