Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(623)

Side by Side Diff: tools/perf/measurements/v8_gc_times_unittest.py

Issue 1400083003: Convert V8GCTimes measurement to timeline based measurement. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix copyright date Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright 2015 The Chromium Authors. All rights reserved. 1 # Copyright 2015 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 from telemetry import decorators 5 from telemetry import decorators
6 from telemetry.internal.results import page_test_results
7 from telemetry.page import page as page_module
8 from telemetry.testing import options_for_unittests 6 from telemetry.testing import options_for_unittests
9 from telemetry.testing import page_test_test_case 7 from telemetry.testing import page_test_test_case
10 from telemetry.timeline import model as model_module
11 from telemetry.util import wpr_modes 8 from telemetry.util import wpr_modes
12 9
13 from measurements import v8_gc_times 10 from measurements import v8_gc_times
14 11
15 12
16 class V8GCTimesTestPageHelper(object):
17
18 def __init__(self, page_set):
19 self._page_set = page_set
20 self._model = model_module.TimelineModel()
21 self._renderer_process = self._model.GetOrCreateProcess(1)
22 self._renderer_thread = self._renderer_process.GetOrCreateThread(2)
23 self._renderer_thread.name = 'CrRendererMain'
24
25 def AddEvent(self, category, name, thread_start, thread_duration,
26 args=None, wall_start=None, wall_duration=None):
27 wall_start = wall_start or thread_start
28 wall_duration = wall_duration or thread_duration
29 self._renderer_thread.BeginSlice(category, name, wall_start, thread_start,
30 args=args)
31 self._renderer_thread.EndSlice(wall_start + wall_duration,
32 thread_start + thread_duration)
33
34 class MockV8GCTimesPage(page_module.Page):
35
36 def __init__(self, page_set):
37 super(V8GCTimesTestPageHelper.MockV8GCTimesPage, self).__init__(
38 'file://blank.html', page_set, page_set.base_dir)
39
40 def MeasureFakePage(self):
41 # Create a fake page and add it to the page set.
42 results = page_test_results.PageTestResults()
43 page = V8GCTimesTestPageHelper.MockV8GCTimesPage(self._page_set)
44 self._page_set.AddStory(page)
45
46 # Pretend we're about to run the tests to silence lower level asserts.
47 results.WillRunPage(page)
48
49 v8_gc_times_metric = v8_gc_times.V8GCTimes()
50 # pylint: disable=protected-access
51 v8_gc_times_metric._renderer_process = self._renderer_process
52
53 # Finalize the timeline import.
54 self._model.FinalizeImport()
55
56 # Measure the V8GCTimes metric and return the results
57 # pylint: disable=protected-access
58 v8_gc_times_metric._AddV8MetricsToResults(self._renderer_process, results)
59 results.DidRunPage(page)
60 return results
61
62
63 class V8GCTimesTests(page_test_test_case.PageTestTestCase): 13 class V8GCTimesTests(page_test_test_case.PageTestTestCase):
64 14
65 def setUp(self): 15 def setUp(self):
66 self._options = options_for_unittests.GetCopy() 16 self._options = options_for_unittests.GetCopy()
67 self._options.browser_options.wpr_mode = wpr_modes.WPR_OFF 17 self._options.browser_options.wpr_mode = wpr_modes.WPR_OFF
68 18
69 def testWithNoTraceEvents(self):
70 test_page_helper = V8GCTimesTestPageHelper(
71 self.CreateEmptyPageSet())
72
73 results = test_page_helper.MeasureFakePage()
74 self._AssertResultsEqual(_GetEmptyResults(), _ActualValues(results))
75
76 def testWithNoGarbageCollectionEvents(self):
77 test_page_helper = V8GCTimesTestPageHelper(
78 self.CreateEmptyPageSet())
79
80 test_page_helper.AddEvent('toplevel', 'PostMessage',
81 thread_start=0, thread_duration=14, wall_start=5, wall_duration=35)
82
83 results = test_page_helper.MeasureFakePage()
84 expected = _GetEmptyResults()
85 expected['duration'] = ('ms', 35)
86 expected['cpu_time'] = ('ms', 14)
87
88 self._AssertResultsEqual(expected, _ActualValues(results))
89
90 def testWithGarbageCollectionEvents(self):
91 test_page_helper = V8GCTimesTestPageHelper(
92 self.CreateEmptyPageSet())
93
94 test_page_helper.AddEvent('toplevel', 'PostMessage',
95 thread_start=0, thread_duration=57, wall_start=5, wall_duration=68)
96 test_page_helper.AddEvent('v8', 'V8.GCScavenger', 5, 4)
97 test_page_helper.AddEvent('v8', 'V8.GCScavenger', 15, 3)
98 test_page_helper.AddEvent('v8', 'V8.GCIncrementalMarking', 23, 4)
99 test_page_helper.AddEvent('v8', 'V8.GCIncrementalMarking', 34, 2)
100 test_page_helper.AddEvent('v8', 'V8.GCCompactor', 42, 4)
101 test_page_helper.AddEvent('v8', 'V8.GCCompactor', 52, 5)
102
103 results = test_page_helper.MeasureFakePage()
104 expected = _GetEmptyResults()
105 expected['duration'] = ('ms', 68)
106 expected['cpu_time'] = ('ms', 57)
107 expected['v8_gc_incremental_marking'] = ('ms', 6.0)
108 expected['v8_gc_incremental_marking_average'] = ('ms', 3.0)
109 expected['v8_gc_incremental_marking_count'] = ('count', 2)
110 expected['v8_gc_incremental_marking_max'] = ('ms', 4.0)
111 expected['v8_gc_incremental_marking_outside_idle'] = ('ms', 6.0)
112 expected['v8_gc_scavenger'] = ('ms', 7.0)
113 expected['v8_gc_scavenger_average'] = ('ms', 3.5)
114 expected['v8_gc_scavenger_count'] = ('count', 2)
115 expected['v8_gc_scavenger_max'] = ('ms', 4.0)
116 expected['v8_gc_scavenger_outside_idle'] = ('ms', 7.0)
117 expected['v8_gc_mark_compactor'] = ('ms', 9.0)
118 expected['v8_gc_mark_compactor_average'] = ('ms', 4.5)
119 expected['v8_gc_mark_compactor_count'] = ('count', 2)
120 expected['v8_gc_mark_compactor_max'] = ('ms', 5.0)
121 expected['v8_gc_mark_compactor_outside_idle'] = ('ms', 9.0)
122 expected['v8_gc_total'] = ('ms', 22.0)
123 expected['v8_gc_total_outside_idle'] = ('ms', 22.0)
124
125 self._AssertResultsEqual(expected, _ActualValues(results))
126
127 def testWithIdleTaskGarbageCollectionEvents(self):
128 test_page_helper = V8GCTimesTestPageHelper(
129 self.CreateEmptyPageSet())
130
131 test_page_helper.AddEvent('toplevel', 'PostMessage',
132 thread_start=0, thread_duration=57, wall_start=5, wall_duration=68)
133
134 test_page_helper.AddEvent('v8', 'V8.GCScavenger', 5, 4)
135 test_page_helper.AddEvent('renderer.scheduler',
136 'SingleThreadIdleTaskRunner::RunTask', 15, 4, {'allotted_time_ms': 12})
137 test_page_helper.AddEvent('v8', 'V8.GCScavenger', 15, 3)
138
139 test_page_helper.AddEvent('v8', 'V8.GCIncrementalMarking', 23, 4)
140 test_page_helper.AddEvent('renderer.scheduler',
141 'SingleThreadIdleTaskRunner::RunTask', 34, 3, {'allotted_time_ms': 12})
142 test_page_helper.AddEvent('v8', 'V8.GCIncrementalMarking', 34, 2)
143
144 test_page_helper.AddEvent('v8', 'V8.GCCompactor', 42, 4)
145 test_page_helper.AddEvent('renderer.scheduler',
146 'SingleThreadIdleTaskRunner::RunTask', 52, 6, {'allotted_time_ms': 12})
147 test_page_helper.AddEvent('v8', 'V8.GCCompactor', 52, 5)
148
149 results = test_page_helper.MeasureFakePage()
150 expected = _GetEmptyResults()
151 expected['duration'] = ('ms', 68)
152 expected['cpu_time'] = ('ms', 57)
153 expected['v8_gc_incremental_marking'] = ('ms', 6.0)
154 expected['v8_gc_incremental_marking_average'] = ('ms', 3.0)
155 expected['v8_gc_incremental_marking_count'] = ('count', 2)
156 expected['v8_gc_incremental_marking_max'] = ('ms', 4.0)
157 expected['v8_gc_incremental_marking_outside_idle'] = ('ms', 4.0)
158 expected['v8_gc_incremental_marking_percentage_idle'] = \
159 ('idle%', 100 * 2 / 6.0)
160 expected['v8_gc_scavenger'] = ('ms', 7.0)
161 expected['v8_gc_scavenger_average'] = ('ms', 3.5)
162 expected['v8_gc_scavenger_count'] = ('count', 2)
163 expected['v8_gc_scavenger_max'] = ('ms', 4.0)
164 expected['v8_gc_scavenger_outside_idle'] = ('ms', 4.0)
165 expected['v8_gc_scavenger_percentage_idle'] = ('idle%', 100 * 3 / 7.0)
166 expected['v8_gc_mark_compactor'] = ('ms', 9.0)
167 expected['v8_gc_mark_compactor_average'] = ('ms', 4.5)
168 expected['v8_gc_mark_compactor_count'] = ('count', 2)
169 expected['v8_gc_mark_compactor_max'] = ('ms', 5.0)
170 expected['v8_gc_mark_compactor_outside_idle'] = ('ms', 4.0)
171 expected['v8_gc_mark_compactor_percentage_idle'] = ('idle%', 100 * 5 / 9.0)
172 expected['v8_gc_total'] = ('ms', 22.0)
173 expected['v8_gc_total_outside_idle'] = ('ms', 12.0)
174 expected['v8_gc_total_percentage_idle'] = ('idle%', 100 * 10 / 22.0)
175
176 self._AssertResultsEqual(expected, _ActualValues(results))
177
178 def testWithIdleTaskOverruns(self):
179 test_page_helper = V8GCTimesTestPageHelper(
180 self.CreateEmptyPageSet())
181
182 test_page_helper.AddEvent('toplevel', 'PostMessage',
183 thread_start=0, thread_duration=80, wall_start=5, wall_duration=92)
184
185 test_page_helper.AddEvent('renderer.scheduler',
186 'SingleThreadIdleTaskRunner::RunTask', 15, 15, {'allotted_time_ms': 8})
187 test_page_helper.AddEvent('v8', 'V8.GCScavenger', 15, 14)
188
189 test_page_helper.AddEvent('renderer.scheduler',
190 'SingleThreadIdleTaskRunner::RunTask', 34, 15, {'allotted_time_ms': 6})
191 test_page_helper.AddEvent('v8', 'V8.GCIncrementalMarking', 34, 14)
192
193 test_page_helper.AddEvent('renderer.scheduler',
194 'SingleThreadIdleTaskRunner::RunTask', 52, 23, {'allotted_time_ms': 9})
195 test_page_helper.AddEvent('v8', 'V8.GCCompactor', 52, 22)
196
197 results = test_page_helper.MeasureFakePage()
198 expected = _GetEmptyResults()
199 expected['duration'] = ('ms', 92)
200 expected['cpu_time'] = ('ms', 80)
201 expected['v8_gc_incremental_marking'] = ('ms', 14.0)
202 expected['v8_gc_incremental_marking_average'] = ('ms', 14.0)
203 expected['v8_gc_incremental_marking_count'] = ('count', 1)
204 expected['v8_gc_incremental_marking_max'] = ('ms', 14.0)
205 expected['v8_gc_incremental_marking_outside_idle'] = ('ms', 8.0)
206 expected['v8_gc_incremental_marking_idle_deadline_overrun'] = ('ms', 8.0)
207 expected['v8_gc_incremental_marking_percentage_idle'] = \
208 ('idle%', 100 * 6 / 14.0)
209 expected['v8_gc_scavenger'] = ('ms', 14.0)
210 expected['v8_gc_scavenger_average'] = ('ms', 14.0)
211 expected['v8_gc_scavenger_count'] = ('count', 1)
212 expected['v8_gc_scavenger_max'] = ('ms', 14.0)
213 expected['v8_gc_scavenger_outside_idle'] = ('ms', 6.0)
214 expected['v8_gc_scavenger_idle_deadline_overrun'] = ('ms', 6.0)
215 expected['v8_gc_scavenger_percentage_idle'] = ('idle%', 100 * 8 / 14.0)
216 expected['v8_gc_mark_compactor'] = ('ms', 22.0)
217 expected['v8_gc_mark_compactor_average'] = ('ms', 22.0)
218 expected['v8_gc_mark_compactor_count'] = ('count', 1)
219 expected['v8_gc_mark_compactor_max'] = ('ms', 22.0)
220 expected['v8_gc_mark_compactor_outside_idle'] = ('ms', 13.0)
221 expected['v8_gc_mark_compactor_idle_deadline_overrun'] = ('ms', 13.0)
222 expected['v8_gc_mark_compactor_percentage_idle'] = ('idle%', 100 * 9 / 22.0)
223 expected['v8_gc_total'] = ('ms', 50.0)
224 expected['v8_gc_total_outside_idle'] = ('ms', 27.0)
225 expected['v8_gc_total_idle_deadline_overrun'] = ('ms', 27.0)
226 expected['v8_gc_total_percentage_idle'] = ('idle%', 100 * 23 / 50.0)
227
228 self._AssertResultsEqual(expected, _ActualValues(results))
229
230 def testWithIdleTaskWallDurationOverruns(self):
231 test_page_helper = V8GCTimesTestPageHelper(
232 self.CreateEmptyPageSet())
233
234 test_page_helper.AddEvent('toplevel', 'PostMessage',
235 thread_start=0, thread_duration=80, wall_start=5, wall_duration=92)
236
237 test_page_helper.AddEvent('renderer.scheduler',
238 'SingleThreadIdleTaskRunner::RunTask', 15, 15, {'allotted_time_ms': 8})
239 test_page_helper.AddEvent('v8', 'V8.GCScavenger',
240 thread_start=15, thread_duration=4, wall_start=15, wall_duration=14)
241
242 results = test_page_helper.MeasureFakePage()
243 expected = _GetEmptyResults()
244 expected['duration'] = ('ms', 92)
245 expected['cpu_time'] = ('ms', 80)
246 expected['v8_gc_scavenger'] = ('ms', 4.0)
247 expected['v8_gc_scavenger_average'] = ('ms', 4.0)
248 expected['v8_gc_scavenger_count'] = ('count', 1)
249 expected['v8_gc_scavenger_max'] = ('ms', 4.0)
250 expected_outside_idle = 4.0 - (4.0 * 8 / 14)
251 expected['v8_gc_scavenger_outside_idle'] = ('ms', expected_outside_idle)
252 expected['v8_gc_scavenger_idle_deadline_overrun'] = ('ms', 6.0)
253 expected['v8_gc_scavenger_percentage_idle'] = \
254 ('idle%', 100 * (4.0 - expected_outside_idle) / 4.0)
255 expected['v8_gc_total'] = expected['v8_gc_scavenger']
256 expected['v8_gc_total_outside_idle'] = \
257 expected['v8_gc_scavenger_outside_idle']
258 expected['v8_gc_total_idle_deadline_overrun'] = \
259 expected['v8_gc_scavenger_idle_deadline_overrun']
260 expected['v8_gc_total_percentage_idle'] = \
261 expected['v8_gc_scavenger_percentage_idle']
262
263 self._AssertResultsEqual(expected, _ActualValues(results))
264
265 def _AssertResultsEqual(self, expected, actual):
266 for key in expected.iterkeys():
267 self.assertIn(key, actual.keys())
268 self.assertEqual(expected[key], actual[key],
269 'Result for [' + key + '] - expected ' + str(expected[key]) +
270 ' but got ' + str(actual[key]))
271
272 @decorators.Disabled('win') # crbug.com/416502 19 @decorators.Disabled('win') # crbug.com/416502
273 def testCleanUpTrace(self): 20 def testCleanUpTrace(self):
274 self.TestTracingCleanedUp(v8_gc_times.V8GCTimes, self._options) 21 self.TestTracingCleanedUp(v8_gc_times.V8GCTimes, self._options)
275
276
277 def _ActualValues(results):
278 return dict(list(
279 (v.name, (v.units, v.value))
280 for v in results.all_page_specific_values
281 ))
282
283
284 def _GetEmptyResults():
285 return {'cpu_time': ('ms', 0.0),
286 'duration': ('ms', 0.0),
287 'v8_gc_incremental_marking': ('ms', 0.0),
288 'v8_gc_incremental_marking_average': ('ms', 0.0),
289 'v8_gc_incremental_marking_count': ('count', 0),
290 'v8_gc_incremental_marking_max': ('ms', 0.0),
291 'v8_gc_incremental_marking_idle_deadline_overrun': ('ms', 0.0),
292 'v8_gc_incremental_marking_outside_idle': ('ms', 0.0),
293 'v8_gc_incremental_marking_percentage_idle': ('idle%', 0.0),
294 'v8_gc_mark_compactor': ('ms', 0.0),
295 'v8_gc_mark_compactor_average': ('ms', 0.0),
296 'v8_gc_mark_compactor_count': ('count', 0),
297 'v8_gc_mark_compactor_max': ('ms', 0.0),
298 'v8_gc_mark_compactor_idle_deadline_overrun': ('ms', 0.0),
299 'v8_gc_mark_compactor_outside_idle': ('ms', 0.0),
300 'v8_gc_mark_compactor_percentage_idle': ('idle%', 0.0),
301 'v8_gc_scavenger': ('ms', 0.0),
302 'v8_gc_scavenger_average': ('ms', 0.0),
303 'v8_gc_scavenger_count': ('count', 0),
304 'v8_gc_scavenger_max': ('ms', 0.0),
305 'v8_gc_scavenger_idle_deadline_overrun': ('ms', 0.0),
306 'v8_gc_scavenger_outside_idle': ('ms', 0.0),
307 'v8_gc_scavenger_percentage_idle': ('idle%', 0.0),
308 'v8_gc_total': ('ms', 0.0),
309 'v8_gc_total_idle_deadline_overrun': ('ms', 0.0),
310 'v8_gc_total_outside_idle': ('ms', 0.0)}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698