OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 import page_sets | 6 import page_sets |
7 import re | 7 import re |
8 | 8 |
9 from measurements import timeline_controller | 9 from measurements import timeline_controller |
10 from metrics import speedindex | 10 from metrics import speedindex |
11 from telemetry import benchmark | 11 from telemetry import benchmark |
12 from telemetry.core import util | 12 from telemetry.core import util |
13 from telemetry.page import page_test | 13 from telemetry.page import page_test |
14 from telemetry.timeline import async_slice as async_slice_module | 14 from telemetry.timeline import async_slice as async_slice_module |
15 from telemetry.timeline import slice as slice_module | 15 from telemetry.timeline import slice as slice_module |
| 16 from telemetry.value import improvement_direction |
16 from telemetry.value import scalar | 17 from telemetry.value import scalar |
17 | 18 |
18 | 19 |
19 class _ServiceWorkerTimelineMetric(object): | 20 class _ServiceWorkerTimelineMetric(object): |
20 def AddResultsOfCounters(self, process, counter_regex_string, results): | 21 def AddResultsOfCounters(self, process, counter_regex_string, results): |
21 counter_filter = re.compile(counter_regex_string) | 22 counter_filter = re.compile(counter_regex_string) |
22 for counter_name, counter in process.counters.iteritems(): | 23 for counter_name, counter in process.counters.iteritems(): |
23 if not counter_filter.search(counter_name): | 24 if not counter_filter.search(counter_name): |
24 continue | 25 continue |
25 | 26 |
26 total = sum(counter.totals) | 27 total = sum(counter.totals) |
27 | 28 |
28 # Results objects cannot contain the '.' character, so remove that here. | 29 # Results objects cannot contain the '.' character, so remove that here. |
29 sanitized_counter_name = counter_name.replace('.', '_') | 30 sanitized_counter_name = counter_name.replace('.', '_') |
30 | 31 |
31 results.AddValue(scalar.ScalarValue( | 32 results.AddValue(scalar.ScalarValue( |
32 results.current_page, sanitized_counter_name, 'count', total)) | 33 results.current_page, sanitized_counter_name, 'count', total, |
| 34 improvement_direction=improvement_direction.DOWN)) |
33 results.AddValue(scalar.ScalarValue( | 35 results.AddValue(scalar.ScalarValue( |
34 results.current_page, sanitized_counter_name + '_avg', 'count', | 36 results.current_page, sanitized_counter_name + '_avg', 'count', |
35 total / float(len(counter.totals)))) | 37 total / float(len(counter.totals)), |
| 38 improvement_direction=improvement_direction.DOWN)) |
36 | 39 |
37 def AddResultsOfEvents( | 40 def AddResultsOfEvents( |
38 self, process, thread_regex_string, event_regex_string, results): | 41 self, process, thread_regex_string, event_regex_string, results): |
39 thread_filter = re.compile(thread_regex_string) | 42 thread_filter = re.compile(thread_regex_string) |
40 event_filter = re.compile(event_regex_string) | 43 event_filter = re.compile(event_regex_string) |
41 | 44 |
42 for thread in process.threads.itervalues(): | 45 for thread in process.threads.itervalues(): |
43 thread_name = thread.name.replace('/', '_') | 46 thread_name = thread.name.replace('/', '_') |
44 if not thread_filter.search(thread_name): | 47 if not thread_filter.search(thread_name): |
45 continue | 48 continue |
(...skipping 22 matching lines...) Expand all Loading... |
68 | 71 |
69 def _AddResultOfEvent(self, thread_name, event_name, times, results): | 72 def _AddResultOfEvent(self, thread_name, event_name, times, results): |
70 total = sum(times) | 73 total = sum(times) |
71 biggest_jank = max(times) | 74 biggest_jank = max(times) |
72 | 75 |
73 # Results objects cannot contain the '.' character, so remove that here. | 76 # Results objects cannot contain the '.' character, so remove that here. |
74 sanitized_event_name = event_name.replace('.', '_') | 77 sanitized_event_name = event_name.replace('.', '_') |
75 | 78 |
76 full_name = thread_name + '|' + sanitized_event_name | 79 full_name = thread_name + '|' + sanitized_event_name |
77 results.AddValue(scalar.ScalarValue( | 80 results.AddValue(scalar.ScalarValue( |
78 results.current_page, full_name, 'ms', total)) | 81 results.current_page, full_name, 'ms', total, |
| 82 improvement_direction=improvement_direction.DOWN)) |
79 results.AddValue(scalar.ScalarValue( | 83 results.AddValue(scalar.ScalarValue( |
80 results.current_page, full_name + '_max', 'ms', biggest_jank)) | 84 results.current_page, full_name + '_max', 'ms', biggest_jank, |
| 85 improvement_direction=improvement_direction.DOWN)) |
81 results.AddValue(scalar.ScalarValue( | 86 results.AddValue(scalar.ScalarValue( |
82 results.current_page, full_name + '_avg', 'ms', total / len(times))) | 87 results.current_page, full_name + '_avg', 'ms', total / len(times), |
| 88 improvement_direction=improvement_direction.DOWN)) |
83 | 89 |
84 | 90 |
85 class _ServiceWorkerMeasurement(page_test.PageTest): | 91 class _ServiceWorkerMeasurement(page_test.PageTest): |
86 """Measure Speed Index and TRACE_EVENTs""" | 92 """Measure Speed Index and TRACE_EVENTs""" |
87 | 93 |
88 def __init__(self): | 94 def __init__(self): |
89 super(_ServiceWorkerMeasurement, self).__init__( | 95 super(_ServiceWorkerMeasurement, self).__init__( |
90 action_name_to_run='RunPageInteractions') | 96 action_name_to_run='RunPageInteractions') |
91 self._timeline_controller = timeline_controller.TimelineController() | 97 self._timeline_controller = timeline_controller.TimelineController() |
92 self._speed_index = speedindex.SpeedIndexMetric() | 98 self._speed_index = speedindex.SpeedIndexMetric() |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 self._timeline_controller.Start(tab) | 159 self._timeline_controller.Start(tab) |
154 | 160 |
155 def ValidateAndMeasurePage(self, page, tab, results): | 161 def ValidateAndMeasurePage(self, page, tab, results): |
156 tab.WaitForJavaScriptExpression('window.done', 40) | 162 tab.WaitForJavaScriptExpression('window.done', 40) |
157 self._timeline_controller.Stop(tab, results) | 163 self._timeline_controller.Stop(tab, results) |
158 | 164 |
159 # Measure JavaScript-land | 165 # Measure JavaScript-land |
160 json = tab.EvaluateJavaScript('window.results || {}') | 166 json = tab.EvaluateJavaScript('window.results || {}') |
161 for key, value in json.iteritems(): | 167 for key, value in json.iteritems(): |
162 results.AddValue(scalar.ScalarValue( | 168 results.AddValue(scalar.ScalarValue( |
163 results.current_page, key, value['units'], value['value'])) | 169 results.current_page, key, value['units'], value['value'], |
| 170 improvement_direction=improvement_direction.DOWN)) |
164 | 171 |
165 # Retrieve TRACE_EVENTs | 172 # Retrieve TRACE_EVENTs |
166 timeline_metric = _ServiceWorkerTimelineMetric() | 173 timeline_metric = _ServiceWorkerTimelineMetric() |
167 browser_process = self._timeline_controller.model.browser_process | 174 browser_process = self._timeline_controller.model.browser_process |
168 filter_text = '(RegisterServiceWorker|'\ | 175 filter_text = '(RegisterServiceWorker|'\ |
169 'UnregisterServiceWorker|'\ | 176 'UnregisterServiceWorker|'\ |
170 'ProcessAllocate|'\ | 177 'ProcessAllocate|'\ |
171 'FindRegistrationForDocument|'\ | 178 'FindRegistrationForDocument|'\ |
172 'DispatchFetchEvent)' | 179 'DispatchFetchEvent)' |
173 timeline_metric.AddResultsOfEvents( | 180 timeline_metric.AddResultsOfEvents( |
(...skipping 12 matching lines...) Expand all Loading... |
186 """This test measures the performance of pages using ServiceWorker. | 193 """This test measures the performance of pages using ServiceWorker. |
187 | 194 |
188 As a page set, two benchamrk pages (many registration, many concurrent | 195 As a page set, two benchamrk pages (many registration, many concurrent |
189 fetching) and one application (Trained-to-thrill: | 196 fetching) and one application (Trained-to-thrill: |
190 https://jakearchibald.github.io/trained-to-thrill/) are included. Execution | 197 https://jakearchibald.github.io/trained-to-thrill/) are included. Execution |
191 time of these pages will be shown as Speed Index, and TRACE_EVENTs are | 198 time of these pages will be shown as Speed Index, and TRACE_EVENTs are |
192 subsidiary information to know more detail performance regression. | 199 subsidiary information to know more detail performance regression. |
193 """ | 200 """ |
194 test = _ServiceWorkerMicroBenchmarkMeasurement | 201 test = _ServiceWorkerMicroBenchmarkMeasurement |
195 page_set = page_sets.ServiceWorkerMicroBenchmarkPageSet | 202 page_set = page_sets.ServiceWorkerMicroBenchmarkPageSet |
OLD | NEW |