| 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 collections | 5 import collections |
| 6 | 6 |
| 7 from metrics import Metric | 7 from metrics import Metric |
| 8 from telemetry.core import bitmap | 8 from telemetry.core import bitmap |
| 9 from telemetry.value import scalar |
| 9 | 10 |
| 10 | 11 |
| 11 class SpeedIndexMetric(Metric): | 12 class SpeedIndexMetric(Metric): |
| 12 """The speed index metric is one way of measuring page load speed. | 13 """The speed index metric is one way of measuring page load speed. |
| 13 | 14 |
| 14 It is meant to approximate user perception of page load speed, and it | 15 It is meant to approximate user perception of page load speed, and it |
| 15 is based on the amount of time that it takes to paint to the visual | 16 is based on the amount of time that it takes to paint to the visual |
| 16 portion of the screen. It includes paint events that occur after the | 17 portion of the screen. It includes paint events that occur after the |
| 17 onload event, and it doesn't include time loading things off-screen. | 18 onload event, and it doesn't include time loading things off-screen. |
| 18 | 19 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 44 assert self.IsFinished(tab), 'Must wait for IsFinished() before Stop()' | 45 assert self.IsFinished(tab), 'Must wait for IsFinished() before Stop()' |
| 45 self._impl.Stop(tab) | 46 self._impl.Stop(tab) |
| 46 | 47 |
| 47 # Optional argument chart_name is not in base class Metric. | 48 # Optional argument chart_name is not in base class Metric. |
| 48 # pylint: disable=W0221 | 49 # pylint: disable=W0221 |
| 49 def AddResults(self, tab, results, chart_name=None): | 50 def AddResults(self, tab, results, chart_name=None): |
| 50 """Calculate the speed index and add it to the results.""" | 51 """Calculate the speed index and add it to the results.""" |
| 51 index = self._impl.CalculateSpeedIndex(tab) | 52 index = self._impl.CalculateSpeedIndex(tab) |
| 52 # Release the tab so that it can be disconnected. | 53 # Release the tab so that it can be disconnected. |
| 53 self._impl = None | 54 self._impl = None |
| 54 results.Add('speed_index', 'ms', index, chart_name=chart_name) | 55 results.AddValue(scalar.ScalarValue( |
| 56 results.current_page, '%s.speed_index' % chart_name, 'ms', index)) |
| 55 | 57 |
| 56 def IsFinished(self, tab): | 58 def IsFinished(self, tab): |
| 57 """Decide whether the timeline recording should be stopped. | 59 """Decide whether the timeline recording should be stopped. |
| 58 | 60 |
| 59 When the timeline recording is stopped determines which paint events | 61 When the timeline recording is stopped determines which paint events |
| 60 are used in the speed index metric calculation. In general, the recording | 62 are used in the speed index metric calculation. In general, the recording |
| 61 should continue if there has just been some data received, because | 63 should continue if there has just been some data received, because |
| 62 this suggests that painting may continue. | 64 this suggests that painting may continue. |
| 63 | 65 |
| 64 A page may repeatedly request resources in an infinite loop; a timeout | 66 A page may repeatedly request resources in an infinite loop; a timeout |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 frame = paint_event.args['frameId'] | 298 frame = paint_event.args['frameId'] |
| 297 return (frame,) + GetBox(paint_event.args['data']['clip']) | 299 return (frame,) + GetBox(paint_event.args['data']['clip']) |
| 298 | 300 |
| 299 def _GroupEventByRectangle(self, paint_events): | 301 def _GroupEventByRectangle(self, paint_events): |
| 300 """Group all paint events according to the rectangle that they update.""" | 302 """Group all paint events according to the rectangle that they update.""" |
| 301 result = collections.defaultdict(list) | 303 result = collections.defaultdict(list) |
| 302 for event in paint_events: | 304 for event in paint_events: |
| 303 assert event.name == 'Paint' | 305 assert event.name == 'Paint' |
| 304 result[self._GetRectangle(event)].append(event) | 306 result[self._GetRectangle(event)].append(event) |
| 305 return result | 307 return result |
| OLD | NEW |