| OLD | NEW |
| (Empty) |
| 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 | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 | |
| 6 # A top level slice of a main thread can cause the webapp to behave | |
| 7 # unresponsively if its thread duration is greater than or equals to | |
| 8 # USER_PERCEIVABLE_DELAY_THRESHOLD_MS. Human eyes can perceive delay at low as | |
| 9 # 100ms, but since we use thread time instead of wall-time, we reduce the | |
| 10 # threshold further to 50ms to make room for other OS's activities. | |
| 11 USER_PERCEIVABLE_DELAY_THRESHOLD_MS = 50 | |
| 12 | |
| 13 | |
| 14 class _MainthreadJankStat(object): | |
| 15 """A small wrapper class for storing mainthread jank stats computed for | |
| 16 single record. | |
| 17 """ | |
| 18 | |
| 19 def __init__(self): | |
| 20 self.sum_big_top_slices_thread_time = 0 | |
| 21 self.biggest_top_slice_thread_time = 0 | |
| 22 | |
| 23 | |
| 24 def _ComputeMainthreadJankStatsForRecord(renderer_thread, record): | |
| 25 """Computes the mainthread jank stat on a record range. | |
| 26 | |
| 27 Returns: | |
| 28 An instance of _MainthreadJankStat, which has: | |
| 29 | |
| 30 sum_big_top_slices_thread_time is the total thread duration of all top | |
| 31 slices whose thread time ranges overlapped with (thread_start, thread_end) | |
| 32 and the overlapped thread duration is greater than or equal | |
| 33 USER_PERCEIVABLE_DELAY_THRESHOLD_MS. | |
| 34 | |
| 35 biggest_top_slice_thread_time is the biggest thread duration of all | |
| 36 top slices whose thread time ranges overlapped with | |
| 37 (thread_start, thread_end). | |
| 38 | |
| 39 Note: thread duration of each slices is computed using overlapped range | |
| 40 with (thread_start, thread_end). | |
| 41 """ | |
| 42 stat = _MainthreadJankStat() | |
| 43 for s in renderer_thread.toplevel_slices: | |
| 44 jank_thread_duration = record.GetOverlappedThreadTimeForSlice(s) | |
| 45 stat.biggest_top_slice_thread_time = max( | |
| 46 stat.biggest_top_slice_thread_time, jank_thread_duration) | |
| 47 if jank_thread_duration >= USER_PERCEIVABLE_DELAY_THRESHOLD_MS: | |
| 48 stat.sum_big_top_slices_thread_time += jank_thread_duration | |
| 49 return stat | |
| 50 | |
| 51 | |
| 52 class MainthreadJankStats(object): | |
| 53 """ | |
| 54 Utility class for extracting main thread jank statistics from the timeline | |
| 55 (or other loggin facilities), and providing them in a common format to | |
| 56 classes that compute benchmark metrics from this data. | |
| 57 | |
| 58 total_big_jank_thread_time is the total thread duration of all top | |
| 59 slices whose thread time ranges overlapped with any thread time ranges of | |
| 60 the records and the overlapped thread duration is greater than or equal | |
| 61 USER_PERCEIVABLE_DELAY_THRESHOLD_MS. | |
| 62 | |
| 63 biggest_jank_thread_time is the biggest thread duration of all | |
| 64 top slices whose thread time ranges overlapped with any of records' thread | |
| 65 time ranges. | |
| 66 """ | |
| 67 | |
| 68 def __init__(self, renderer_thread, interaction_records): | |
| 69 self._renderer_thread = renderer_thread | |
| 70 self._interaction_records = interaction_records | |
| 71 self._total_big_jank_thread_time = 0 | |
| 72 self._biggest_jank_thread_time = 0 | |
| 73 self._ComputeMainthreadJankStats() | |
| 74 | |
| 75 @property | |
| 76 def total_big_jank_thread_time(self): | |
| 77 return self._total_big_jank_thread_time | |
| 78 | |
| 79 @property | |
| 80 def biggest_jank_thread_time(self): | |
| 81 return self._biggest_jank_thread_time | |
| 82 | |
| 83 def _ComputeMainthreadJankStats(self): | |
| 84 for record in self._interaction_records: | |
| 85 record_jank_stat = _ComputeMainthreadJankStatsForRecord( | |
| 86 self._renderer_thread, record) | |
| 87 self._total_big_jank_thread_time += ( | |
| 88 record_jank_stat.sum_big_top_slices_thread_time) | |
| 89 self._biggest_jank_thread_time = ( | |
| 90 max(self._biggest_jank_thread_time, | |
| 91 record_jank_stat.biggest_top_slice_thread_time)) | |
| OLD | NEW |