| 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 import logging | 5 import logging |
| 6 | 6 |
| 7 from telemetry.util import perf_tests_helper | 7 from telemetry.util import perf_tests_helper |
| 8 from telemetry.util import statistics | 8 from telemetry.util import statistics |
| 9 from telemetry.value import improvement_direction | 9 from telemetry.value import improvement_direction |
| 10 from telemetry.value import list_of_scalar_values | 10 from telemetry.value import list_of_scalar_values |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 def __init__(self): | 48 def __init__(self): |
| 49 super(SmoothnessMetric, self).__init__() | 49 super(SmoothnessMetric, self).__init__() |
| 50 | 50 |
| 51 def AddResults(self, model, renderer_thread, interaction_records, results): | 51 def AddResults(self, model, renderer_thread, interaction_records, results): |
| 52 self.VerifyNonOverlappedRecords(interaction_records) | 52 self.VerifyNonOverlappedRecords(interaction_records) |
| 53 renderer_process = renderer_thread.parent | 53 renderer_process = renderer_thread.parent |
| 54 stats = rendering_stats.RenderingStats( | 54 stats = rendering_stats.RenderingStats( |
| 55 renderer_process, model.browser_process, model.surface_flinger_process, | 55 renderer_process, model.browser_process, model.surface_flinger_process, |
| 56 [r.GetBounds() for r in interaction_records]) | 56 [r.GetBounds() for r in interaction_records]) |
| 57 has_surface_flinger_stats = model.surface_flinger_process is not None | 57 has_surface_flinger_stats = model.surface_flinger_process is not None |
| 58 self._PopulateResultsFromStats(results, stats, has_surface_flinger_stats) | 58 self._PopulateResultsFromStats(results, stats, has_surface_flinger_stats, |
| 59 interaction_records[0].label) |
| 59 | 60 |
| 60 def _PopulateResultsFromStats(self, results, stats, | 61 def _PopulateResultsFromStats( |
| 61 has_surface_flinger_stats): | 62 self, results, stats, has_surface_flinger_stats, tir_label): |
| 62 page = results.current_page | 63 page = results.current_page |
| 63 values = [ | 64 values = [ |
| 64 self._ComputeQueueingDuration(page, stats), | 65 self._ComputeQueueingDuration(page, stats), |
| 65 self._ComputeFrameTimeDiscrepancy(page, stats), | 66 self._ComputeFrameTimeDiscrepancy(page, stats), |
| 66 self._ComputeMeanPixelsApproximated(page, stats), | 67 self._ComputeMeanPixelsApproximated(page, stats), |
| 67 self._ComputeMeanPixelsCheckerboarded(page, stats) | 68 self._ComputeMeanPixelsCheckerboarded(page, stats) |
| 68 ] | 69 ] |
| 69 values += self._ComputeLatencyMetric(page, stats, 'input_event_latency', | 70 values += self._ComputeLatencyMetric(page, stats, 'input_event_latency', |
| 70 stats.input_event_latency) | 71 stats.input_event_latency) |
| 71 values += self._ComputeLatencyMetric(page, stats, | 72 values += self._ComputeLatencyMetric(page, stats, |
| 72 'main_thread_scroll_latency', | 73 'main_thread_scroll_latency', |
| 73 stats.main_thread_scroll_latency) | 74 stats.main_thread_scroll_latency) |
| 74 values.append(self._ComputeFirstGestureScrollUpdateLatencies(page, stats)) | 75 values.append(self._ComputeFirstGestureScrollUpdateLatencies(page, stats)) |
| 75 values += self._ComputeFrameTimeMetric(page, stats) | 76 values += self._ComputeFrameTimeMetric(page, stats) |
| 76 if has_surface_flinger_stats: | 77 if has_surface_flinger_stats: |
| 77 values += self._ComputeSurfaceFlingerMetric(page, stats) | 78 values += self._ComputeSurfaceFlingerMetric(page, stats) |
| 78 | 79 |
| 79 for v in values: | 80 for v in values: |
| 81 v.tir_label = tir_label |
| 80 results.AddValue(v) | 82 results.AddValue(v) |
| 81 | 83 |
| 82 def _HasEnoughFrames(self, list_of_frame_timestamp_lists): | 84 def _HasEnoughFrames(self, list_of_frame_timestamp_lists): |
| 83 """Whether we have collected at least two frames in every timestamp list.""" | 85 """Whether we have collected at least two frames in every timestamp list.""" |
| 84 return all(len(s) >= 2 for s in list_of_frame_timestamp_lists) | 86 return all(len(s) >= 2 for s in list_of_frame_timestamp_lists) |
| 85 | 87 |
| 86 @staticmethod | 88 @staticmethod |
| 87 def _GetNormalizedDeltas(data, refresh_period, min_normalized_delta=None): | 89 def _GetNormalizedDeltas(data, refresh_period, min_normalized_delta=None): |
| 88 deltas = [t2 - t1 for t1, t2 in zip(data, data[1:])] | 90 deltas = [t2 - t1 for t1, t2 in zip(data, data[1:])] |
| 89 if min_normalized_delta != None: | 91 if min_normalized_delta != None: |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 perf_tests_helper.FlattenList( | 342 perf_tests_helper.FlattenList( |
| 341 stats.checkerboarded_pixel_percentages)), 3) | 343 stats.checkerboarded_pixel_percentages)), 3) |
| 342 else: | 344 else: |
| 343 none_value_reason = NOT_ENOUGH_FRAMES_MESSAGE | 345 none_value_reason = NOT_ENOUGH_FRAMES_MESSAGE |
| 344 return scalar.ScalarValue( | 346 return scalar.ScalarValue( |
| 345 page, 'mean_pixels_checkerboarded', 'percent', | 347 page, 'mean_pixels_checkerboarded', 'percent', |
| 346 mean_pixels_checkerboarded, | 348 mean_pixels_checkerboarded, |
| 347 description='Percentage of pixels that were checkerboarded.', | 349 description='Percentage of pixels that were checkerboarded.', |
| 348 none_value_reason=none_value_reason, | 350 none_value_reason=none_value_reason, |
| 349 improvement_direction=improvement_direction.DOWN) | 351 improvement_direction=improvement_direction.DOWN) |
| OLD | NEW |