| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 from collections import defaultdict | 5 from collections import defaultdict |
| 6 | 6 |
| 7 from telemetry.core.platform import tracing_category_filter | 7 from telemetry.core.platform import tracing_category_filter |
| 8 from telemetry.core.platform import tracing_options | 8 from telemetry.core.platform import tracing_options |
| 9 from telemetry.page import page_test | 9 from telemetry.page import page_test |
| 10 from telemetry.timeline import model as model_module | 10 from telemetry.timeline import model as model_module |
| 11 from telemetry.value import trace | 11 from telemetry.value import trace |
| 12 from telemetry.web_perf import timeline_interaction_record as tir_module | 12 from telemetry.web_perf import timeline_interaction_record as tir_module |
| 13 from telemetry.web_perf.metrics import fast_metric |
| 13 from telemetry.web_perf.metrics import responsiveness_metric | 14 from telemetry.web_perf.metrics import responsiveness_metric |
| 14 from telemetry.web_perf.metrics import smoothness | 15 from telemetry.web_perf.metrics import smoothness |
| 15 | 16 |
| 16 # TimelineBasedMeasurement considers all instrumentation as producing a single | 17 # TimelineBasedMeasurement considers all instrumentation as producing a single |
| 17 # timeline. But, depending on the amount of instrumentation that is enabled, | 18 # timeline. But, depending on the amount of instrumentation that is enabled, |
| 18 # overhead increases. The user of the measurement must therefore chose between | 19 # overhead increases. The user of the measurement must therefore chose between |
| 19 # a few levels of instrumentation. | 20 # a few levels of instrumentation. |
| 20 NO_OVERHEAD_LEVEL = 'no-overhead' | 21 NO_OVERHEAD_LEVEL = 'no-overhead' |
| 22 V8_OVERHEAD_LEVEL = 'v8-overhead' |
| 21 MINIMAL_OVERHEAD_LEVEL = 'minimal-overhead' | 23 MINIMAL_OVERHEAD_LEVEL = 'minimal-overhead' |
| 22 DEBUG_OVERHEAD_LEVEL = 'debug-overhead' | 24 DEBUG_OVERHEAD_LEVEL = 'debug-overhead' |
| 23 | 25 |
| 24 ALL_OVERHEAD_LEVELS = [ | 26 ALL_OVERHEAD_LEVELS = [ |
| 25 NO_OVERHEAD_LEVEL, | 27 NO_OVERHEAD_LEVEL, |
| 28 V8_OVERHEAD_LEVEL, |
| 26 MINIMAL_OVERHEAD_LEVEL, | 29 MINIMAL_OVERHEAD_LEVEL, |
| 27 DEBUG_OVERHEAD_LEVEL | 30 DEBUG_OVERHEAD_LEVEL |
| 28 ] | 31 ] |
| 29 | 32 |
| 30 DEFAULT_METRICS = { | 33 DEFAULT_METRICS = { |
| 34 tir_module.IS_FAST: fast_metric.FastMetric, |
| 31 tir_module.IS_SMOOTH: smoothness.SmoothnessMetric, | 35 tir_module.IS_SMOOTH: smoothness.SmoothnessMetric, |
| 32 tir_module.IS_RESPONSIVE: responsiveness_metric.ResponsivenessMetric, | 36 tir_module.IS_RESPONSIVE: responsiveness_metric.ResponsivenessMetric, |
| 33 } | 37 } |
| 34 | 38 |
| 35 class InvalidInteractions(Exception): | 39 class InvalidInteractions(Exception): |
| 36 pass | 40 pass |
| 37 | 41 |
| 38 | 42 |
| 39 def _GetMetricsFromFlags(record_custom_flags): | 43 def _GetMetricsFromFlags(record_custom_flags): |
| 40 flags_set = set(record_custom_flags) | 44 flags_set = set(record_custom_flags) |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 Benchmark.CreateTimelineBasedMeasurementOptions. | 135 Benchmark.CreateTimelineBasedMeasurementOptions. |
| 132 """ | 136 """ |
| 133 | 137 |
| 134 def __init__(self, overhead_level=NO_OVERHEAD_LEVEL, | 138 def __init__(self, overhead_level=NO_OVERHEAD_LEVEL, |
| 135 get_metrics_from_flags_callback=_GetMetricsFromFlags): | 139 get_metrics_from_flags_callback=_GetMetricsFromFlags): |
| 136 """As the amount of instrumentation increases, so does the overhead. | 140 """As the amount of instrumentation increases, so does the overhead. |
| 137 The user of the measurement chooses the overhead level that is appropriate, | 141 The user of the measurement chooses the overhead level that is appropriate, |
| 138 and the tracing is filtered accordingly. | 142 and the tracing is filtered accordingly. |
| 139 | 143 |
| 140 overhead_level: Can either be a custom TracingCategoryFilter object or | 144 overhead_level: Can either be a custom TracingCategoryFilter object or |
| 141 one of NO_OVERHEAD_LEVEL, MINIMAL_OVERHEAD_LEVEL or | 145 one of NO_OVERHEAD_LEVEL, V8_OVERHEAD_LEVEL, MINIMAL_OVERHEAD_LEVEL, |
| 142 DEBUG_OVERHEAD_LEVEL. | 146 or DEBUG_OVERHEAD_LEVEL. The v8 overhead level is a temporary solution |
| 147 that may be removed. |
| 143 get_metrics_from_flags_callback: Callback function which returns a | 148 get_metrics_from_flags_callback: Callback function which returns a |
| 144 a list of metrics based on timeline record flags. See the default | 149 a list of metrics based on timeline record flags. See the default |
| 145 _GetMetricsFromFlags() as an example. | 150 _GetMetricsFromFlags() as an example. |
| 146 """ | 151 """ |
| 147 if (not isinstance(overhead_level, | 152 if (not isinstance(overhead_level, |
| 148 tracing_category_filter.TracingCategoryFilter) and | 153 tracing_category_filter.TracingCategoryFilter) and |
| 149 overhead_level not in ALL_OVERHEAD_LEVELS): | 154 overhead_level not in ALL_OVERHEAD_LEVELS): |
| 150 raise Exception("Overhead level must be a TracingCategoryFilter object" | 155 raise Exception("Overhead level must be a TracingCategoryFilter object" |
| 151 " or valid overhead level string." | 156 " or valid overhead level string." |
| 152 " Given overhead level: %s" % overhead_level) | 157 " Given overhead level: %s" % overhead_level) |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 | 217 |
| 213 if isinstance(self._tbm_options.overhead_level, | 218 if isinstance(self._tbm_options.overhead_level, |
| 214 tracing_category_filter.TracingCategoryFilter): | 219 tracing_category_filter.TracingCategoryFilter): |
| 215 category_filter = self._tbm_options.overhead_level | 220 category_filter = self._tbm_options.overhead_level |
| 216 else: | 221 else: |
| 217 assert self._tbm_options.overhead_level in ALL_OVERHEAD_LEVELS, ( | 222 assert self._tbm_options.overhead_level in ALL_OVERHEAD_LEVELS, ( |
| 218 "Invalid TBM Overhead Level: %s" % self._tbm_options.overhead_level) | 223 "Invalid TBM Overhead Level: %s" % self._tbm_options.overhead_level) |
| 219 | 224 |
| 220 if self._tbm_options.overhead_level == NO_OVERHEAD_LEVEL: | 225 if self._tbm_options.overhead_level == NO_OVERHEAD_LEVEL: |
| 221 category_filter = tracing_category_filter.CreateNoOverheadFilter() | 226 category_filter = tracing_category_filter.CreateNoOverheadFilter() |
| 227 # TODO(ernstm): Remove this overhead level when benchmark relevant v8 |
| 228 # events become available in the 'benchmark' category. |
| 229 elif self._tbm_options.overhead_level == V8_OVERHEAD_LEVEL: |
| 230 category_filter = tracing_category_filter.CreateNoOverheadFilter() |
| 231 category_filter.AddIncludedCategory('v8') |
| 222 elif self._tbm_options.overhead_level == MINIMAL_OVERHEAD_LEVEL: | 232 elif self._tbm_options.overhead_level == MINIMAL_OVERHEAD_LEVEL: |
| 223 category_filter = tracing_category_filter.CreateMinimalOverheadFilter() | 233 category_filter = tracing_category_filter.CreateMinimalOverheadFilter() |
| 224 else: | 234 else: |
| 225 category_filter = tracing_category_filter.CreateDebugOverheadFilter() | 235 category_filter = tracing_category_filter.CreateDebugOverheadFilter() |
| 226 | 236 |
| 227 for new_category_filter in self._tbm_options.extra_category_filters: | 237 for new_category_filter in self._tbm_options.extra_category_filters: |
| 228 category_filter.AddIncludedCategory(new_category_filter) | 238 category_filter.AddIncludedCategory(new_category_filter) |
| 229 | 239 |
| 230 # TODO(slamm): Move synthetic_delay_categories to the TBM options. | 240 # TODO(slamm): Move synthetic_delay_categories to the TBM options. |
| 231 for delay in synthetic_delay_categories or []: | 241 for delay in synthetic_delay_categories or []: |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 tracing_controller, page.GetSyntheticDelayCategories()) | 279 tracing_controller, page.GetSyntheticDelayCategories()) |
| 270 | 280 |
| 271 def ValidateAndMeasurePage(self, page, tab, results): | 281 def ValidateAndMeasurePage(self, page, tab, results): |
| 272 """Collect all possible metrics and added them to results.""" | 282 """Collect all possible metrics and added them to results.""" |
| 273 tracing_controller = tab.browser.platform.tracing_controller | 283 tracing_controller = tab.browser.platform.tracing_controller |
| 274 self._measurement.Measure(tracing_controller, results) | 284 self._measurement.Measure(tracing_controller, results) |
| 275 | 285 |
| 276 def CleanUpAfterPage(self, page, tab): | 286 def CleanUpAfterPage(self, page, tab): |
| 277 tracing_controller = tab.browser.platform.tracing_controller | 287 tracing_controller = tab.browser.platform.tracing_controller |
| 278 self._measurement.DidRunUserStory(tracing_controller) | 288 self._measurement.DidRunUserStory(tracing_controller) |
| OLD | NEW |