Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 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 import os | 5 import os |
| 6 | 6 |
| 7 from core import path_util | 7 from core import path_util |
| 8 from core import perf_benchmark | 8 from core import perf_benchmark |
| 9 | 9 |
| 10 from page_sets import webgl_supported_shared_state | |
| 11 | |
| 10 from telemetry import benchmark | 12 from telemetry import benchmark |
| 11 from telemetry import page as page_module | 13 from telemetry import page as page_module |
| 12 from telemetry.page import legacy_page_test | 14 from telemetry.page import legacy_page_test |
| 13 from telemetry.page import shared_page_state | 15 from telemetry.page import shared_page_state |
| 14 from telemetry import story | 16 from telemetry import story |
| 15 from telemetry.timeline import bounds | 17 from telemetry.timeline import bounds |
| 16 from telemetry.timeline import model as model_module | 18 from telemetry.timeline import model as model_module |
| 17 from telemetry.timeline import tracing_config | 19 from telemetry.timeline import tracing_config |
| 18 | 20 |
| 19 from telemetry.value import list_of_scalar_values | 21 from telemetry.value import list_of_scalar_values |
| 20 from telemetry.value import scalar | |
| 21 from telemetry.value import trace | 22 from telemetry.value import trace |
| 22 | 23 |
| 23 | 24 |
| 24 from measurements import timeline_controller | |
| 25 from page_sets import webgl_supported_shared_state | |
| 26 | |
| 27 | |
| 28 BLINK_PERF_BASE_DIR = os.path.join(path_util.GetChromiumSrcDir(), | 25 BLINK_PERF_BASE_DIR = os.path.join(path_util.GetChromiumSrcDir(), |
| 29 'third_party', 'WebKit', 'PerformanceTests') | 26 'third_party', 'WebKit', 'PerformanceTests') |
| 30 SKIPPED_FILE = os.path.join(BLINK_PERF_BASE_DIR, 'Skipped') | 27 SKIPPED_FILE = os.path.join(BLINK_PERF_BASE_DIR, 'Skipped') |
| 31 | 28 |
| 32 | 29 |
| 33 def CreateStorySetFromPath(path, skipped_file, | 30 def CreateStorySetFromPath(path, skipped_file, |
| 34 shared_page_state_class=( | 31 shared_page_state_class=( |
| 35 shared_page_state.SharedPageState)): | 32 shared_page_state.SharedPageState)): |
| 36 assert os.path.exists(path) | 33 assert os.path.exists(path) |
| 37 | 34 |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 132 else: | 129 else: |
| 133 intersect_cpu_time = intersect_wall_time | 130 intersect_cpu_time = intersect_wall_time |
| 134 trace_cpu_time_metrics[event_name][curr_test_runs_bound_index] += ( | 131 trace_cpu_time_metrics[event_name][curr_test_runs_bound_index] += ( |
| 135 intersect_cpu_time) | 132 intersect_cpu_time) |
| 136 return trace_cpu_time_metrics | 133 return trace_cpu_time_metrics |
| 137 | 134 |
| 138 | 135 |
| 139 class _BlinkPerfMeasurement(legacy_page_test.LegacyPageTest): | 136 class _BlinkPerfMeasurement(legacy_page_test.LegacyPageTest): |
| 140 """Tuns a blink performance test and reports the results.""" | 137 """Tuns a blink performance test and reports the results.""" |
| 141 | 138 |
| 139 trace_event_to_metric_map = {} | |
| 140 | |
| 142 def __init__(self): | 141 def __init__(self): |
| 143 super(_BlinkPerfMeasurement, self).__init__() | 142 super(_BlinkPerfMeasurement, self).__init__() |
| 144 with open(os.path.join(os.path.dirname(__file__), | 143 with open(os.path.join(os.path.dirname(__file__), |
| 145 'blink_perf.js'), 'r') as f: | 144 'blink_perf.js'), 'r') as f: |
| 146 self._blink_perf_js = f.read() | 145 self._blink_perf_js = f.read() |
| 147 | 146 |
| 148 def WillNavigateToPage(self, page, tab): | 147 def WillNavigateToPage(self, page, tab): |
| 149 del tab # unused | 148 del tab # unused |
| 150 page.script_to_evaluate_on_commit = self._blink_perf_js | 149 page.script_to_evaluate_on_commit = self._blink_perf_js |
| 151 | 150 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 191 unit = 'ms' | 190 unit = 'ms' |
| 192 print | 191 print |
| 193 for trace_event_name, cpu_times in trace_cpu_time_metrics.iteritems(): | 192 for trace_event_name, cpu_times in trace_cpu_time_metrics.iteritems(): |
| 194 print 'CPU times of trace event "%s":' % trace_event_name | 193 print 'CPU times of trace event "%s":' % trace_event_name |
| 195 cpu_times_string = ', '.join(['{0:.10f}'.format(t) for t in cpu_times]) | 194 cpu_times_string = ', '.join(['{0:.10f}'.format(t) for t in cpu_times]) |
| 196 print 'values %s %s' % (cpu_times_string, unit) | 195 print 'values %s %s' % (cpu_times_string, unit) |
| 197 avg = 0.0 | 196 avg = 0.0 |
| 198 if cpu_times: | 197 if cpu_times: |
| 199 avg = sum(cpu_times)/len(cpu_times) | 198 avg = sum(cpu_times)/len(cpu_times) |
| 200 print 'avg', '{0:.10f}'.format(avg), unit | 199 print 'avg', '{0:.10f}'.format(avg), unit |
| 200 if self.trace_event_to_metric_map: | |
| 201 metric_name = self.trace_event_to_metric_map[trace_event_name] | |
| 202 else: | |
| 203 metric_name = trace_event_name | |
| 201 results.AddValue(list_of_scalar_values.ListOfScalarValues( | 204 results.AddValue(list_of_scalar_values.ListOfScalarValues( |
| 202 results.current_page, name=trace_event_name, units=unit, | 205 results.current_page, name=metric_name, units=unit, |
| 203 values=cpu_times)) | 206 values=cpu_times)) |
| 204 print | 207 print |
| 205 print '\n' | 208 print '\n' |
| 206 | 209 |
| 207 def ValidateAndMeasurePage(self, page, tab, results): | 210 def ValidateAndMeasurePage(self, page, tab, results): |
| 208 tab.WaitForJavaScriptCondition( | 211 tab.WaitForJavaScriptCondition( |
| 209 'testRunner.isDone || testRunner.isWaitingForTracingStart', timeout=600) | 212 'testRunner.isDone || testRunner.isWaitingForTracingStart', timeout=600) |
| 210 trace_cpu_time_metrics = {} | 213 trace_cpu_time_metrics = {} |
| 211 if tab.EvaluateJavaScript('testRunner.isWaitingForTracingStart'): | 214 if tab.EvaluateJavaScript('testRunner.isWaitingForTracingStart'): |
| 212 trace_data = self._ContinueTestRunWithTracing(tab) | 215 trace_data = self._ContinueTestRunWithTracing(tab) |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 235 results.AddValue(list_of_scalar_values.ListOfScalarValues( | 238 results.AddValue(list_of_scalar_values.ListOfScalarValues( |
| 236 results.current_page, metric, units, values)) | 239 results.current_page, metric, units, values)) |
| 237 | 240 |
| 238 break | 241 break |
| 239 | 242 |
| 240 print log | 243 print log |
| 241 | 244 |
| 242 self.PrintAndCollectTraceEventMetrics(trace_cpu_time_metrics, results) | 245 self.PrintAndCollectTraceEventMetrics(trace_cpu_time_metrics, results) |
| 243 | 246 |
| 244 | 247 |
| 245 # TODO(wangxianzhu): Convert the paint benchmarks to use the new blink_perf | |
| 246 # tracing once it's ready. | |
| 247 class _BlinkPerfPaintMeasurement(_BlinkPerfMeasurement): | |
| 248 """Also collects prePaint and paint timing from traces.""" | |
| 249 | |
| 250 def __init__(self): | |
| 251 super(_BlinkPerfPaintMeasurement, self).__init__() | |
| 252 self._controller = None | |
| 253 | |
| 254 def WillNavigateToPage(self, page, tab): | |
| 255 super(_BlinkPerfPaintMeasurement, self).WillNavigateToPage(page, tab) | |
| 256 self._controller = timeline_controller.TimelineController() | |
| 257 self._controller.trace_categories = 'blink,blink.console' | |
| 258 self._controller.SetUp(page, tab) | |
| 259 self._controller.Start(tab) | |
| 260 | |
| 261 def DidRunPage(self, platform): | |
| 262 if self._controller: | |
| 263 self._controller.CleanUp(platform) | |
| 264 | |
| 265 def ValidateAndMeasurePage(self, page, tab, results): | |
| 266 super(_BlinkPerfPaintMeasurement, self).ValidateAndMeasurePage( | |
| 267 page, tab, results) | |
| 268 self._controller.Stop(tab, results) | |
| 269 renderer = self._controller.model.GetRendererThreadFromTabId(tab.id) | |
| 270 # The marker marks the beginning and ending of the measured runs. | |
| 271 marker = next(event for event in renderer.async_slices | |
| 272 if event.name == 'blink_perf' | |
| 273 and event.category == 'blink.console') | |
| 274 assert marker | |
| 275 | |
| 276 for event in renderer.all_slices: | |
| 277 if event.start < marker.start or event.end > marker.end: | |
| 278 continue | |
| 279 if event.name == 'FrameView::prePaint': | |
| 280 results.AddValue( | |
| 281 scalar.ScalarValue(page, 'prePaint', 'ms', event.duration)) | |
| 282 if event.name == 'FrameView::paintTree': | |
| 283 results.AddValue( | |
| 284 scalar.ScalarValue(page, 'paint', 'ms', event.duration)) | |
| 285 | |
| 286 | |
| 287 class _BlinkPerfBenchmark(perf_benchmark.PerfBenchmark): | 248 class _BlinkPerfBenchmark(perf_benchmark.PerfBenchmark): |
| 288 | 249 |
| 289 test = _BlinkPerfMeasurement | 250 test = _BlinkPerfMeasurement |
| 290 | 251 |
| 291 @classmethod | 252 @classmethod |
| 292 def Name(cls): | 253 def Name(cls): |
| 293 return 'blink_perf.' + cls.tag | 254 return 'blink_perf.' + cls.tag |
| 294 | 255 |
| 295 def CreateStorySet(self, options): | 256 def CreateStorySet(self, options): |
| 296 path = os.path.join(BLINK_PERF_BASE_DIR, self.subdir) | 257 path = os.path.join(BLINK_PERF_BASE_DIR, self.subdir) |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 370 tag = 'layout' | 331 tag = 'layout' |
| 371 subdir = 'Layout' | 332 subdir = 'Layout' |
| 372 | 333 |
| 373 @classmethod | 334 @classmethod |
| 374 def ShouldDisable(cls, possible_browser): | 335 def ShouldDisable(cls, possible_browser): |
| 375 return cls.IsSvelte(possible_browser) # http://crbug.com/551950 | 336 return cls.IsSvelte(possible_browser) # http://crbug.com/551950 |
| 376 | 337 |
| 377 | 338 |
| 378 @benchmark.Owner(emails=['wangxianzhu@chromium.org']) | 339 @benchmark.Owner(emails=['wangxianzhu@chromium.org']) |
| 379 class BlinkPerfPaint(_BlinkPerfBenchmark): | 340 class BlinkPerfPaint(_BlinkPerfBenchmark): |
| 380 test = _BlinkPerfPaintMeasurement | 341 class _PaintMeasurement(_BlinkPerfMeasurement): |
| 342 trace_event_to_metric_map = { | |
| 343 'FrameView::prePaint' : 'prePaint', | |
|
nednguyen
2017/05/12 21:45:30
Besides the data continuity problem, do you think
| |
| 344 'FrameView::paintTree' : 'paint', | |
| 345 } | |
| 346 | |
| 347 test = _PaintMeasurement | |
| 381 tag = 'paint' | 348 tag = 'paint' |
| 382 subdir = 'Paint' | 349 subdir = 'Paint' |
| 383 | 350 |
| 384 @classmethod | 351 @classmethod |
| 385 def ShouldDisable(cls, possible_browser): | 352 def ShouldDisable(cls, possible_browser): |
| 386 return cls.IsSvelte(possible_browser) # http://crbug.com/574483 | 353 return cls.IsSvelte(possible_browser) # http://crbug.com/574483 |
| 387 | 354 |
| 388 | 355 |
| 389 @benchmark.Disabled('win') # crbug.com/488493 | 356 @benchmark.Disabled('win') # crbug.com/488493 |
| 390 @benchmark.Owner(emails=['yukishiino@chromium.org', | 357 @benchmark.Owner(emails=['yukishiino@chromium.org', |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 402 | 369 |
| 403 | 370 |
| 404 @benchmark.Owner(emails=['hayato@chromium.org']) | 371 @benchmark.Owner(emails=['hayato@chromium.org']) |
| 405 class BlinkPerfShadowDOM(_BlinkPerfBenchmark): | 372 class BlinkPerfShadowDOM(_BlinkPerfBenchmark): |
| 406 tag = 'shadow_dom' | 373 tag = 'shadow_dom' |
| 407 subdir = 'ShadowDOM' | 374 subdir = 'ShadowDOM' |
| 408 | 375 |
| 409 @classmethod | 376 @classmethod |
| 410 def ShouldDisable(cls, possible_browser): # http://crbug.com/702319 | 377 def ShouldDisable(cls, possible_browser): # http://crbug.com/702319 |
| 411 return possible_browser.platform.GetDeviceTypeName() == 'Nexus 5X' | 378 return possible_browser.platform.GetDeviceTypeName() == 'Nexus 5X' |
| OLD | NEW |