| 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 PageTestMeasurement |
| 9 from measurements import timeline_controller | 10 from measurements import timeline_controller |
| 10 from metrics import speedindex | 11 from metrics import speedindex |
| 11 from telemetry import benchmark | 12 from telemetry import benchmark |
| 12 from telemetry.core import util | 13 from telemetry.core import util |
| 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 scalar | 16 from telemetry.value import scalar |
| 17 | 17 |
| 18 | 18 |
| 19 class _ServiceWorkerTimelineMetric(object): | 19 class _ServiceWorkerTimelineMetric(object): |
| 20 def AddResultsOfCounters(self, process, counter_regex_string, results): | 20 def AddResultsOfCounters(self, process, counter_regex_string, results): |
| 21 counter_filter = re.compile(counter_regex_string) | 21 counter_filter = re.compile(counter_regex_string) |
| 22 for counter_name, counter in process.counters.iteritems(): | 22 for counter_name, counter in process.counters.iteritems(): |
| 23 if not counter_filter.search(counter_name): | 23 if not counter_filter.search(counter_name): |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 | 75 |
| 76 full_name = thread_name + '|' + sanitized_event_name | 76 full_name = thread_name + '|' + sanitized_event_name |
| 77 results.AddValue(scalar.ScalarValue( | 77 results.AddValue(scalar.ScalarValue( |
| 78 results.current_page, full_name, 'ms', total)) | 78 results.current_page, full_name, 'ms', total)) |
| 79 results.AddValue(scalar.ScalarValue( | 79 results.AddValue(scalar.ScalarValue( |
| 80 results.current_page, full_name + '_max', 'ms', biggest_jank)) | 80 results.current_page, full_name + '_max', 'ms', biggest_jank)) |
| 81 results.AddValue(scalar.ScalarValue( | 81 results.AddValue(scalar.ScalarValue( |
| 82 results.current_page, full_name + '_avg', 'ms', total / len(times))) | 82 results.current_page, full_name + '_avg', 'ms', total / len(times))) |
| 83 | 83 |
| 84 | 84 |
| 85 class _ServiceWorkerMeasurement(page_test.PageTest): | 85 class _ServiceWorkerMeasurement(PageTestMeasurement): |
| 86 """Measure Speed Index and TRACE_EVENTs""" | 86 """Measure Speed Index and TRACE_EVENTs""" |
| 87 | 87 |
| 88 def __init__(self, *args, **kwargs): | 88 def __init__(self, *args, **kwargs): |
| 89 super(_ServiceWorkerMeasurement, self).__init__(*args, **kwargs) | 89 super(_ServiceWorkerMeasurement, self).__init__(*args, **kwargs) |
| 90 self._timeline_controller = timeline_controller.TimelineController() | 90 self._timeline_controller = timeline_controller.TimelineController() |
| 91 self._speed_index = speedindex.SpeedIndexMetric() | 91 self._speed_index = speedindex.SpeedIndexMetric() |
| 92 self._page_open_times = collections.defaultdict(int) | 92 self._page_open_times = collections.defaultdict(int) |
| 93 | 93 |
| 94 def CustomizeBrowserOptions(self, options): | 94 def CustomizeBrowserOptions(self, options): |
| 95 super(_ServiceWorkerMeasurement, self).CustomizeBrowserOptions(options) |
| 95 options.AppendExtraBrowserArgs([ | 96 options.AppendExtraBrowserArgs([ |
| 96 '--enable-experimental-web-platform-features' | 97 '--enable-experimental-web-platform-features' |
| 97 ]) | 98 ]) |
| 98 | 99 |
| 99 def WillNavigateToPage(self, page, tab): | 100 def WillNavigateToPage(self, page, tab): |
| 100 self._timeline_controller.SetUp(page, tab) | 101 self._timeline_controller.SetUp(page, tab) |
| 101 self._timeline_controller.Start(tab) | 102 self._timeline_controller.Start(tab) |
| 102 self._speed_index.Start(page, tab) | 103 self._speed_index.Start(page, tab) |
| 103 | 104 |
| 104 def ValidateAndMeasurePage(self, page, tab, results): | 105 def ValidateAndMeasurePage(self, page, tab, results): |
| 105 tab.WaitForDocumentReadyStateToBeComplete(40) | 106 tab.WaitForDocumentReadyStateToBeComplete(40) |
| 106 self._timeline_controller.Stop(tab) | 107 self._timeline_controller.Stop(tab) |
| 107 | 108 |
| 108 # Retrieve TRACE_EVENTs | 109 # Retrieve TRACE_EVENTs |
| 109 timeline_metric = _ServiceWorkerTimelineMetric() | 110 timeline_metric = _ServiceWorkerTimelineMetric() |
| 110 browser_process = self._timeline_controller.model.browser_process | 111 browser_process = self._timeline_controller.model.browser_process |
| 111 filter_text = '(RegisterServiceWorker|'\ | 112 filter_text = '(RegisterServiceWorker|'\ |
| 112 'UnregisterServiceWorker|'\ | 113 'UnregisterServiceWorker|'\ |
| 113 'ProcessAllocate|'\ | 114 'ProcessAllocate|'\ |
| 114 'FindRegistrationForDocument|'\ | 115 'FindRegistrationForDocument|'\ |
| 115 'DispatchFetchEvent)' | 116 'DispatchFetchEvent)' |
| 116 timeline_metric.AddResultsOfEvents( | 117 timeline_metric.AddResultsOfEvents( |
| 117 browser_process, 'IOThread', filter_text , results) | 118 browser_process, 'IOThread', filter_text , results) |
| 119 super(_ServiceWorkerMeasurement, self).ValidateAndMeasurePage( |
| 120 page, tab, results) |
| 118 | 121 |
| 119 # Record Speed Index | 122 # Record Speed Index |
| 120 def SpeedIndexIsFinished(): | 123 def SpeedIndexIsFinished(): |
| 121 return self._speed_index.IsFinished(tab) | 124 return self._speed_index.IsFinished(tab) |
| 122 util.WaitFor(SpeedIndexIsFinished, 60) | 125 util.WaitFor(SpeedIndexIsFinished, 60) |
| 123 self._speed_index.Stop(page, tab) | 126 self._speed_index.Stop(page, tab) |
| 124 # Distinguish the first and second load from the subsequent loads | 127 # Distinguish the first and second load from the subsequent loads |
| 125 url = str(page) | 128 url = str(page) |
| 126 chart_prefix = 'page_load' | 129 chart_prefix = 'page_load' |
| 127 self._page_open_times[url] += 1 | 130 self._page_open_times[url] += 1 |
| 128 if self._page_open_times[url] == 1: | 131 if self._page_open_times[url] == 1: |
| 129 chart_prefix += '_1st' | 132 chart_prefix += '_1st' |
| 130 elif self._page_open_times[url] == 2: | 133 elif self._page_open_times[url] == 2: |
| 131 chart_prefix += '_2nd' | 134 chart_prefix += '_2nd' |
| 132 else: | 135 else: |
| 133 chart_prefix += '_later' | 136 chart_prefix += '_later' |
| 134 self._speed_index.AddResults(tab, results, chart_prefix) | 137 self._speed_index.AddResults(tab, results, chart_prefix) |
| 135 | 138 |
| 136 | 139 |
| 137 class _ServiceWorkerMicroBenchmarkMeasurement(page_test.PageTest): | 140 class _ServiceWorkerMicroBenchmarkMeasurement(PageTestMeasurement): |
| 138 """Measure JS land values and TRACE_EVENTs""" | 141 """Measure JS land values and TRACE_EVENTs""" |
| 139 | 142 |
| 140 def __init__(self, *args, **kwargs): | 143 def __init__(self, *args, **kwargs): |
| 141 super(_ServiceWorkerMicroBenchmarkMeasurement, self).__init__(*args, | 144 super(_ServiceWorkerMicroBenchmarkMeasurement, self).__init__(*args, |
| 142 **kwargs) | 145 **kwargs) |
| 143 self._timeline_controller = timeline_controller.TimelineController() | 146 self._timeline_controller = timeline_controller.TimelineController() |
| 144 | 147 |
| 145 def CustomizeBrowserOptions(self, options): | 148 def CustomizeBrowserOptions(self, options): |
| 149 super(_ServiceWorkerMicroBenchmarkMeasurement, self).\ |
| 150 CustomizeBrowserOptions(options) |
| 146 options.AppendExtraBrowserArgs([ | 151 options.AppendExtraBrowserArgs([ |
| 147 '--enable-experimental-web-platform-features' | 152 '--enable-experimental-web-platform-features' |
| 148 ]) | 153 ]) |
| 149 | 154 |
| 150 def WillNavigateToPage(self, page, tab): | 155 def WillNavigateToPage(self, page, tab): |
| 151 self._timeline_controller.SetUp(page, tab) | 156 self._timeline_controller.SetUp(page, tab) |
| 152 self._timeline_controller.Start(tab) | 157 self._timeline_controller.Start(tab) |
| 153 | 158 |
| 154 def ValidateAndMeasurePage(self, page, tab, results): | 159 def ValidateAndMeasurePage(self, page, tab, results): |
| 155 tab.WaitForJavaScriptExpression('window.done', 40) | 160 tab.WaitForJavaScriptExpression('window.done', 40) |
| 156 self._timeline_controller.Stop(tab) | 161 self._timeline_controller.Stop(tab) |
| 157 | 162 |
| 158 # Measure JavaScript-land | 163 # Measure JavaScript-land |
| 159 json = tab.EvaluateJavaScript('window.results || {}') | 164 json = tab.EvaluateJavaScript('window.results || {}') |
| 160 for key, value in json.iteritems(): | 165 for key, value in json.iteritems(): |
| 161 results.AddValue(scalar.ScalarValue( | 166 results.AddValue(scalar.ScalarValue( |
| 162 results.current_page, key, value['units'], value['value'])) | 167 results.current_page, key, value['units'], value['value'])) |
| 163 | 168 |
| 164 # Retrieve TRACE_EVENTs | 169 # Retrieve TRACE_EVENTs |
| 165 timeline_metric = _ServiceWorkerTimelineMetric() | 170 timeline_metric = _ServiceWorkerTimelineMetric() |
| 166 browser_process = self._timeline_controller.model.browser_process | 171 browser_process = self._timeline_controller.model.browser_process |
| 167 filter_text = '(RegisterServiceWorker|'\ | 172 filter_text = '(RegisterServiceWorker|'\ |
| 168 'UnregisterServiceWorker|'\ | 173 'UnregisterServiceWorker|'\ |
| 169 'ProcessAllocate|'\ | 174 'ProcessAllocate|'\ |
| 170 'FindRegistrationForDocument|'\ | 175 'FindRegistrationForDocument|'\ |
| 171 'DispatchFetchEvent)' | 176 'DispatchFetchEvent)' |
| 172 timeline_metric.AddResultsOfEvents( | 177 timeline_metric.AddResultsOfEvents( |
| 173 browser_process, 'IOThread', filter_text , results) | 178 browser_process, 'IOThread', filter_text , results) |
| 179 super(_ServiceWorkerMicroBenchmarkMeasurement, self).ValidateAndMeasurePage( |
| 180 page, tab, results) |
| 174 | 181 |
| 175 | 182 |
| 176 @benchmark.Enabled('android') | 183 @benchmark.Enabled('android') |
| 177 class ServiceWorkerPerfTest(benchmark.Benchmark): | 184 class ServiceWorkerPerfTest(benchmark.Benchmark): |
| 178 """Performance test on public applications using ServiceWorker""" | 185 """Performance test on public applications using ServiceWorker""" |
| 179 test = _ServiceWorkerMeasurement | 186 test = _ServiceWorkerMeasurement |
| 180 page_set = page_sets.ServiceWorkerPageSet | 187 page_set = page_sets.ServiceWorkerPageSet |
| 181 | 188 |
| 182 | 189 |
| 183 # FIXME(nhiroki): Temporary disable the benchmark (http://crbug.com/430232). | 190 # FIXME(nhiroki): Temporary disable the benchmark (http://crbug.com/430232). |
| 184 @benchmark.Disabled | 191 @benchmark.Disabled |
| 185 class ServiceWorkerMicroBenchmarkPerfTest(benchmark.Benchmark): | 192 class ServiceWorkerMicroBenchmarkPerfTest(benchmark.Benchmark): |
| 186 """Service Worker performance test using a micro benchmark page set""" | 193 """Service Worker performance test using a micro benchmark page set""" |
| 187 test = _ServiceWorkerMicroBenchmarkMeasurement | 194 test = _ServiceWorkerMicroBenchmarkMeasurement |
| 188 page_set = page_sets.ServiceWorkerMicroBenchmarkPageSet | 195 page_set = page_sets.ServiceWorkerMicroBenchmarkPageSet |
| OLD | NEW |