Index: build/android/pylib/surface_stats_collector.py |
diff --git a/build/android/pylib/surface_stats_collector.py b/build/android/pylib/surface_stats_collector.py |
index d5709fffe7d72159f45e5824cfcf075fc8f949e4..5b1281b4ec0a335f69747b2095d2c05864f5dd7d 100644 |
--- a/build/android/pylib/surface_stats_collector.py |
+++ b/build/android/pylib/surface_stats_collector.py |
@@ -85,6 +85,45 @@ class SurfaceStatsCollector(object): |
deltas = [t2 - t1 for t1, t2 in zip(data, data[1:])] |
return (deltas, [delta / refresh_period for delta in deltas]) |
+ @staticmethod |
+ def _CalculateResults(refresh_period, timestamps, result_suffix): |
+ """Returns a list of SurfaceStatsCollector.Result.""" |
+ frame_count = len(timestamps) |
+ seconds = timestamps[-1] - timestamps[0] |
+ |
+ frame_lengths, normalized_frame_lengths = \ |
+ SurfaceStatsCollector._GetNormalizedDeltas(timestamps, refresh_period) |
+ length_changes, normalized_changes = \ |
+ SurfaceStatsCollector._GetNormalizedDeltas( |
+ frame_lengths, refresh_period) |
+ jankiness = [max(0, round(change)) for change in normalized_changes] |
+ pause_threshold = 20 |
+ jank_count = sum(1 for change in jankiness |
+ if change > 0 and change < pause_threshold) |
+ return [ |
+ SurfaceStatsCollector.Result( |
+ 'avg_surface_fps' + result_suffix, |
+ int(round(frame_count / seconds)), 'fps'), |
+ SurfaceStatsCollector.Result( |
+ 'jank_count' + result_suffix, jank_count, 'janks'), |
+ SurfaceStatsCollector.Result( |
+ 'max_frame_delay' + result_suffix, |
+ round(max(normalized_frame_lengths)), |
+ 'vsyncs'), |
+ SurfaceStatsCollector.Result( |
+ 'frame_lengths' + result_suffix, normalized_frame_lengths, |
+ 'vsyncs'), |
+ ] |
+ |
+ @staticmethod |
+ def _CalculateBuckets(refresh_period, timestamps): |
+ results = [] |
+ for pct in [0.99, 0.5]: |
+ sliced = timestamps[int(-pct * len(timestamps)) + 3 : ] |
+ results += SurfaceStatsCollector._CalculateResults( |
+ refresh_period, sliced, '_' + str(int(pct * 100))) |
+ return results |
+ |
def _StorePerfResults(self): |
if self._use_legacy_method: |
surface_after = self._GetSurfaceStatsLegacy() |
@@ -92,36 +131,21 @@ class SurfaceStatsCollector(object): |
seconds = td.seconds + td.microseconds / 1e6 |
frame_count = (surface_after['page_flip_count'] - |
self._surface_before['page_flip_count']) |
- else: |
- assert self._collector_thread |
- (refresh_period, timestamps) = self._GetDataFromThread() |
- if not refresh_period or not len(timestamps) >= 3: |
- if self._warn_about_empty_data: |
- logging.warning('Surface stat data is empty') |
- return |
- frame_count = len(timestamps) |
- seconds = timestamps[-1] - timestamps[0] |
- |
- frame_lengths, normalized_frame_lengths = \ |
- self._GetNormalizedDeltas(timestamps, refresh_period) |
- length_changes, normalized_changes = \ |
- self._GetNormalizedDeltas(frame_lengths, refresh_period) |
- jankiness = [max(0, round(change)) for change in normalized_changes] |
- pause_threshold = 20 |
- jank_count = sum(1 for change in jankiness |
- if change > 0 and change < pause_threshold) |
- |
- self._results.append(SurfaceStatsCollector.Result( |
- 'refresh_period', refresh_period, 'seconds')) |
- self._results.append(SurfaceStatsCollector.Result( |
- 'jank_count', jank_count, 'janks')) |
- self._results.append(SurfaceStatsCollector.Result( |
- 'max_frame_delay', round(max(normalized_frame_lengths)), |
- 'vsyncs')) |
self._results.append(SurfaceStatsCollector.Result( |
- 'frame_lengths', normalized_frame_lengths, 'vsyncs')) |
+ 'avg_surface_fps', int(round(frame_count / seconds)), 'fps')) |
+ return |
+ |
+ # Non-legacy method. |
+ assert self._collector_thread |
+ (refresh_period, timestamps) = self._GetDataFromThread() |
+ if not refresh_period or not len(timestamps) >= 3: |
+ if self._warn_about_empty_data: |
+ logging.warning('Surface stat data is empty') |
+ return |
self._results.append(SurfaceStatsCollector.Result( |
- 'avg_surface_fps', int(round(frame_count / seconds)), 'fps')) |
+ 'refresh_period', refresh_period, 'seconds')) |
+ self._results += self._CalculateResults(refresh_period, timestamps, '') |
+ self._results += self._CalculateBuckets(refresh_period, timestamps) |
def _CollectorThread(self): |
last_timestamp = 0 |