Index: tools/perf/metrics/rendering_stats.py |
diff --git a/tools/perf/metrics/rendering_stats.py b/tools/perf/metrics/rendering_stats.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b2e556632b09c3da9b1f48f534332e0d3b951111 |
--- /dev/null |
+++ b/tools/perf/metrics/rendering_stats.py |
@@ -0,0 +1,95 @@ |
+# Copyright 2013 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+class RenderingStats(object): |
+ def __init__(self, smoothness_marker, gesture_marker, rendering_stats_deltas, |
+ used_gpu_benchmarking): |
+ """ |
+ Utility class for extracting rendering statistics from the timeline (or |
+ other loggin facilities), and providing them in a common format to classes |
+ that compute benchmark metrics from this data. |
+ |
+ Stats can either be numbers, or lists of numbers. Classes that calculate |
+ metrics from the stats must be able to handle both cases. The length of |
+ different list stats may vary. |
+ |
+ All *_time values are measured in seconds. |
+ """ |
+ self.renderer_process = smoothness_marker.start_thread.parent |
+ self.start = gesture_marker.start |
+ self.end = self.start + gesture_marker.duration |
+ |
+ self.total_time = (self.end - self.start) / 1000.0 |
+ self.frame_count = [] |
+ self.frame_timestamps = [] |
+ self.paint_time = [] |
+ self.painted_pixel_count = [] |
+ self.record_time = [] |
+ self.recorded_pixel_count = [] |
+ self.rasterize_time = [] |
+ self.rasterized_pixel_count = [] |
+ |
+ if used_gpu_benchmarking: |
+ self.initMainThreadStatsFromTimeline() |
+ self.initImplThreadStatsFromTimeline() |
+ else: |
+ self.initFrameCountsFromRenderingStats(rendering_stats_deltas) |
+ |
+ def initFrameCountsFromRenderingStats(self, rs): |
+ # TODO(ernstm): remove numFramesSentToScreen when RenderingStats |
+ # cleanup CL was picked up by the reference build. |
+ if 'frameCount' in rs: |
+ self.frame_count = rs.get('frameCount', 0) |
+ else: |
+ self.frame_count = rs.get('numFramesSentToScreen', 0) |
+ |
+ def initMainThreadStatsFromTimeline(self): |
+ for event in self.renderer_process.IterAllSlicesOfName( |
+ 'MainThreadRenderingStats::IssueTraceEvent'): |
+ if event.start >= self.start and event.end <= self.end: |
+ if 'data' not in event.args: |
+ continue |
+ # TODO(ernstm): remove screen_frame_count when RenderingStats |
+ # cleanup CL was picked up by the reference build. |
+ if 'frame_count' in event.args['data']: |
+ frame_count = event.args['data']['frame_count'] |
+ else: |
+ frame_count = event.args['data']['screen_frame_count'] |
+ self.frame_count.append(frame_count) |
+ if frame_count > 1: |
+ raise ValueError, 'trace contains multi-frame render stats' |
+ if frame_count == 1: |
+ self.frame_timestamps.append( |
+ event.start) |
+ self.paint_time.append( |
+ event.args['data']['paint_time']) |
+ self.painted_pixel_count.append( |
+ event.args['data']['painted_pixel_count']) |
+ self.record_time.append( |
+ event.args['data']['record_time']) |
+ self.recorded_pixel_count.append( |
+ event.args['data']['recorded_pixel_count']) |
+ |
+ def initImplThreadStatsFromTimeline(self): |
+ for event in self.renderer_process.IterAllSlicesOfName( |
+ 'ImplThreadRenderingStats::IssueTraceEvent'): |
+ if event.start >= self.start and event.end <= self.end: |
+ if 'data' not in event.args: |
+ continue |
+ # TODO(ernstm): remove screen_frame_count when RenderingStats |
+ # cleanup CL was picked up by the reference build. |
+ if 'frame_count' in event.args['data']: |
+ frame_count = event.args['data']['frame_count'] |
+ else: |
+ frame_count = event.args['data']['screen_frame_count'] |
+ self.frame_count.append(frame_count) |
+ if frame_count > 1: |
+ raise ValueError, 'trace contains multi-frame render stats' |
+ if frame_count == 1: |
+ self.frame_timestamps.append( |
+ event.start) |
+ self.rasterize_time.append( |
+ event.args['data']['rasterize_time']) |
+ self.rasterized_pixel_count.append( |
+ event.args['data']['rasterized_pixel_count']) |