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 import os | 4 import os |
5 | 5 |
6 from telemetry.core import util | 6 from telemetry.core import util |
| 7 from metrics import discrepancy |
7 | 8 |
8 TIMELINE_MARKER = 'smoothness_scroll' | 9 TIMELINE_MARKER = 'smoothness_scroll' |
9 | 10 |
10 class SmoothnessMetrics(object): | 11 class SmoothnessMetrics(object): |
11 def __init__(self, tab): | 12 def __init__(self, tab): |
12 self._tab = tab | 13 self._tab = tab |
13 with open( | 14 with open( |
14 os.path.join(os.path.dirname(__file__), | 15 os.path.join(os.path.dirname(__file__), |
15 'smoothness.js')) as f: | 16 'smoothness.js')) as f: |
16 js = f.read() | 17 js = f.read() |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 denominator_total = Total(denominator) | 82 denominator_total = Total(denominator) |
82 if denominator_total == 0: | 83 if denominator_total == 0: |
83 return 0 | 84 return 0 |
84 avg = numerator_total / denominator_total | 85 avg = numerator_total / denominator_total |
85 if scale: | 86 if scale: |
86 avg *= scale | 87 avg *= scale |
87 if precision: | 88 if precision: |
88 avg = round(avg, precision) | 89 avg = round(avg, precision) |
89 return avg | 90 return avg |
90 | 91 |
| 92 def DivideIfPossibleOrZero(numerator, denominator): |
| 93 if not denominator: |
| 94 return 0.0 |
| 95 else: |
| 96 return numerator / denominator |
| 97 |
| 98 def GeneralizedMean(values, exponent): |
| 99 ''' http://en.wikipedia.org/wiki/Generalized_mean ''' |
| 100 if not values: |
| 101 return 0.0 |
| 102 sum_of_powers = 0.0 |
| 103 for v in values: |
| 104 sum_of_powers += v ** exponent |
| 105 return (sum_of_powers / len(values)) ** (1.0/exponent) |
| 106 |
| 107 def Median(values): |
| 108 if not values: |
| 109 return 0.0 |
| 110 values.sort() |
| 111 n = len(values) |
| 112 if n % 2: |
| 113 median = values[n/2] |
| 114 else: |
| 115 median = 0.5 * (values[n/2] + values[n/2 - 1]) |
| 116 return median |
| 117 |
91 def CalcFirstPaintTimeResults(results, tab): | 118 def CalcFirstPaintTimeResults(results, tab): |
92 if tab.browser.is_content_shell: | 119 if tab.browser.is_content_shell: |
93 results.Add('first_paint', 'ms', 'unsupported') | 120 results.Add('first_paint', 'ms', 'unsupported') |
94 return | 121 return |
95 | 122 |
96 tab.ExecuteJavaScript(""" | 123 tab.ExecuteJavaScript(""" |
97 window.__rafFired = false; | 124 window.__rafFired = false; |
98 window.webkitRequestAnimationFrame(function() { | 125 window.webkitRequestAnimationFrame(function() { |
99 window.__rafFired = true; | 126 window.__rafFired = true; |
100 }); | 127 }); |
101 """) | 128 """) |
102 util.WaitFor(lambda: tab.EvaluateJavaScript('window.__rafFired'), 60) | 129 util.WaitFor(lambda: tab.EvaluateJavaScript('window.__rafFired'), 60) |
103 | 130 |
104 first_paint_secs = tab.EvaluateJavaScript( | 131 first_paint_secs = tab.EvaluateJavaScript( |
105 'window.chrome.loadTimes().firstPaintTime - ' + | 132 'window.chrome.loadTimes().firstPaintTime - ' + |
106 'window.chrome.loadTimes().startLoadTime') | 133 'window.chrome.loadTimes().startLoadTime') |
107 | 134 |
108 results.Add('first_paint', 'ms', round(first_paint_secs * 1000, 1)) | 135 results.Add('first_paint', 'ms', round(first_paint_secs * 1000, 1)) |
109 | 136 |
110 def CalcResults(benchmark_stats, results): | 137 def CalcResults(benchmark_stats, results): |
111 s = benchmark_stats | 138 s = benchmark_stats |
112 | 139 |
| 140 frame_times = [] |
| 141 for i in xrange(1, len(s.screen_frame_timestamps)): |
| 142 frame_times.append( |
| 143 s.screen_frame_timestamps[i] - s.screen_frame_timestamps[i-1]) |
| 144 |
113 # Scroll Results | 145 # Scroll Results |
114 results.Add('mean_frame_time', 'ms', | 146 results.Add('mean_frame_time', 'ms', |
115 Average(s.total_time, s.screen_frame_count, 1000, 3)) | 147 Average(s.total_time, s.screen_frame_count, 1000, 3)) |
| 148 # Absolute discrepancy of frame time stamps (experimental) |
| 149 results.Add('experimental_jank', '', |
| 150 round(discrepancy.FrameDiscrepancy(s.screen_frame_timestamps, |
| 151 True), 4)) |
| 152 # Generalized mean frame time with exponent=2 (experimental) |
| 153 results.Add('experimental_mean_frame_time', '', |
| 154 round(GeneralizedMean(frame_times, 2.0), 2)) |
| 155 # Median frame time (experimental) |
| 156 results.Add('experimental_median_frame_time', '', |
| 157 round(Median(frame_times), 2)) |
| 158 |
116 results.Add('dropped_percent', '%', | 159 results.Add('dropped_percent', '%', |
117 Average(s.dropped_frame_count, s.screen_frame_count, | 160 Average(s.dropped_frame_count, s.screen_frame_count, |
118 100, 1), | 161 100, 1), |
119 data_type='unimportant') | 162 data_type='unimportant') |
120 results.Add('percent_impl_scrolled', '%', | 163 results.Add('percent_impl_scrolled', '%', |
121 Average(s.impl_thread_scroll_count, | 164 Average(s.impl_thread_scroll_count, |
122 s.impl_thread_scroll_count + | 165 s.impl_thread_scroll_count + |
123 s.main_thread_scroll_count, | 166 s.main_thread_scroll_count, |
124 100, 1), | 167 100, 1), |
125 data_type='unimportant') | 168 data_type='unimportant') |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 Average(s.touch_ui_latency, s.touch_ui_count, 1000, 3), | 218 Average(s.touch_ui_latency, s.touch_ui_count, 1000, 3), |
176 data_type='unimportant') | 219 data_type='unimportant') |
177 results.Add('average_touch_acked_latency', 'ms', | 220 results.Add('average_touch_acked_latency', 'ms', |
178 Average(s.touch_acked_latency, s.touch_acked_count, | 221 Average(s.touch_acked_latency, s.touch_acked_count, |
179 1000, 3), | 222 1000, 3), |
180 data_type='unimportant') | 223 data_type='unimportant') |
181 results.Add('average_scroll_update_latency', 'ms', | 224 results.Add('average_scroll_update_latency', 'ms', |
182 Average(s.scroll_update_latency, s.scroll_update_count, | 225 Average(s.scroll_update_latency, s.scroll_update_count, |
183 1000, 3), | 226 1000, 3), |
184 data_type='unimportant') | 227 data_type='unimportant') |
OLD | NEW |