| OLD | NEW |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 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 telemetry.page import page_test | |
| 6 from telemetry.timeline.model import TimelineModel | |
| 7 from telemetry.timeline import tracing_category_filter | |
| 8 from telemetry.timeline import tracing_options | |
| 9 from telemetry.util import statistics | 5 from telemetry.util import statistics |
| 10 from telemetry.value import scalar | 6 from telemetry.value import scalar |
| 7 from telemetry.web_perf.metrics import timeline_based_metric |
| 11 | 8 |
| 12 | 9 |
| 13 class V8GCTimes(page_test.PageTest): | 10 class V8GCTimesMetric(timeline_based_metric.TimelineBasedMetric): |
| 14 | |
| 15 _TIME_OUT_IN_SECONDS = 60 | |
| 16 _CATEGORIES = ['blink.console', | |
| 17 'renderer.scheduler', | |
| 18 'v8', | |
| 19 'webkit.console'] | |
| 20 _RENDERER_MAIN_THREAD = 'CrRendererMain' | 11 _RENDERER_MAIN_THREAD = 'CrRendererMain' |
| 21 _IDLE_TASK_PARENT = 'SingleThreadIdleTaskRunner::RunTask' | 12 _IDLE_TASK_PARENT = 'SingleThreadIdleTaskRunner::RunTask' |
| 22 | 13 |
| 23 def __init__(self): | 14 def __init__(self): |
| 24 super(V8GCTimes, self).__init__() | 15 super(V8GCTimesMetric, self).__init__() |
| 25 | 16 |
| 26 def WillNavigateToPage(self, page, tab): | 17 def AddResults(self, model, renderer_thread, interaction_records, results): |
| 27 category_filter = tracing_category_filter.TracingCategoryFilter() | 18 renderer_process = renderer_thread.parent |
| 28 | |
| 29 for category in self._CATEGORIES: | |
| 30 category_filter.AddIncludedCategory(category) | |
| 31 | |
| 32 options = tracing_options.TracingOptions() | |
| 33 options.enable_chrome_trace = True | |
| 34 | |
| 35 tab.browser.platform.tracing_controller.Start( | |
| 36 options, category_filter, self._TIME_OUT_IN_SECONDS) | |
| 37 | |
| 38 def ValidateAndMeasurePage(self, page, tab, results): | |
| 39 trace_data = tab.browser.platform.tracing_controller.Stop() | |
| 40 timeline_model = TimelineModel(trace_data) | |
| 41 renderer_process = timeline_model.GetRendererProcessFromTabId(tab.id) | |
| 42 self._AddV8MetricsToResults(renderer_process, results) | 19 self._AddV8MetricsToResults(renderer_process, results) |
| 43 | 20 |
| 44 def DidRunPage(self, platform): | |
| 45 if platform.tracing_controller.is_tracing_running: | |
| 46 platform.tracing_controller.Stop() | |
| 47 | |
| 48 def _AddV8MetricsToResults(self, process, results): | 21 def _AddV8MetricsToResults(self, process, results): |
| 49 if process is None: | 22 if process is None: |
| 50 return | 23 return |
| 51 | 24 |
| 52 for thread in process.threads.values(): | 25 for thread in process.threads.values(): |
| 53 if thread.name != self._RENDERER_MAIN_THREAD: | 26 if thread.name != self._RENDERER_MAIN_THREAD: |
| 54 continue | 27 continue |
| 55 | 28 |
| 56 self._AddV8EventStatsToResults(thread, results) | 29 self._AddV8EventStatsToResults(thread, results) |
| 57 self._AddCpuTimeStatsToResults(thread, results) | 30 self._AddCpuTimeStatsToResults(thread, results) |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 for v8_event_stat in v8_event_stats_list: | 155 for v8_event_stat in v8_event_stats_list: |
| 183 if v8_event_stat.src_event_name == event_name: | 156 if v8_event_stat.src_event_name == event_name: |
| 184 return v8_event_stat | 157 return v8_event_stat |
| 185 return None | 158 return None |
| 186 | 159 |
| 187 | 160 |
| 188 def _ParentIdleTask(event): | 161 def _ParentIdleTask(event): |
| 189 parent = event.parent_slice | 162 parent = event.parent_slice |
| 190 while parent: | 163 while parent: |
| 191 # pylint: disable=protected-access | 164 # pylint: disable=protected-access |
| 192 if parent.name == V8GCTimes._IDLE_TASK_PARENT: | 165 if parent.name == V8GCTimesMetric._IDLE_TASK_PARENT: |
| 193 return parent | 166 return parent |
| 194 parent = parent.parent_slice | 167 parent = parent.parent_slice |
| 195 return None | 168 return None |
| 196 | 169 |
| 197 | 170 |
| 198 class V8EventStat(object): | 171 class V8EventStat(object): |
| 199 | 172 |
| 200 def __init__(self, src_event_name, result_name, result_description): | 173 def __init__(self, src_event_name, result_name, result_description): |
| 201 self.src_event_name = src_event_name | 174 self.src_event_name = src_event_name |
| 202 self.result_name = result_name | 175 self.result_name = result_name |
| 203 self.result_description = result_description | 176 self.result_description = result_description |
| 204 self.thread_duration = 0.0 | 177 self.thread_duration = 0.0 |
| 205 self.thread_duration_inside_idle = 0.0 | 178 self.thread_duration_inside_idle = 0.0 |
| 206 self.idle_task_overrun_duration = 0.0 | 179 self.idle_task_overrun_duration = 0.0 |
| 207 self.max_thread_duration = 0.0 | 180 self.max_thread_duration = 0.0 |
| 208 self.count = 0 | 181 self.count = 0 |
| 209 | 182 |
| 210 @property | 183 @property |
| 211 def thread_duration_outside_idle(self): | 184 def thread_duration_outside_idle(self): |
| 212 return self.thread_duration - self.thread_duration_inside_idle | 185 return self.thread_duration - self.thread_duration_inside_idle |
| 213 | 186 |
| 214 @property | 187 @property |
| 215 def percentage_thread_duration_during_idle(self): | 188 def percentage_thread_duration_during_idle(self): |
| 216 return statistics.DivideIfPossibleOrZero( | 189 return statistics.DivideIfPossibleOrZero( |
| 217 100 * self.thread_duration_inside_idle, self.thread_duration) | 190 100 * self.thread_duration_inside_idle, self.thread_duration) |
| OLD | NEW |