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

Side by Side Diff: tools/perf/metrics/gpu_timeline_unittest.py

Issue 854833003: Added GPU performance metrics. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Simplified gpu_timeline using new SwapBuffer trace Created 5 years, 11 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
(Empty)
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
3 # found in the LICENSE file.
4
5 import unittest
6
7 from metrics import test_page_test_results
8 from metrics import gpu_timeline
9 from telemetry.timeline import async_slice as async_slice_module
10 from telemetry.timeline import slice as slice_module
11 from telemetry.timeline import model as model_module
12 from telemetry.web_perf import timeline_interaction_record as tir_module
13
14 SERVICE_FRAME_END_CATEGORY, SERVICE_FRAME_END_NAME = \
15 gpu_timeline.SERVICE_FRAME_END_MARKER
16
17 DEVICE_FRAME_END_CATEGORY, DEVICE_FRAME_END_NAME = \
18 gpu_timeline.DEVICE_FRAME_END_MARKER
19
20 INTERACTION_RECORDS = [tir_module.TimelineInteractionRecord("test-record",
21 0,
22 float('inf'))]
23
24
25 def _CreateGPUSlices(parent_thread, name, start_time, duration, offset=0):
26 args = { 'gl_category': gpu_timeline.TOPLEVEL_GL_CATEGORY }
27 return (slice_module.Slice(parent_thread,
28 gpu_timeline.TOPLEVEL_SERVICE_CATEGORY,
29 name, start_time,
30 args=args,
31 duration=duration,
32 thread_duration=duration),
33 async_slice_module.AsyncSlice(gpu_timeline.TOPLEVEL_DEVICE_CATEGORY,
34 name, start_time + offset,
35 args=args,
36 duration=duration))
37
38 def _CreateFrameEndSlices(parent_thread, start_time, duration, offset=0):
39 args = { 'gl_category': gpu_timeline.TOPLEVEL_GL_CATEGORY }
40 return (slice_module.Slice(parent_thread,
41 SERVICE_FRAME_END_CATEGORY,
42 SERVICE_FRAME_END_NAME,
43 start_time,
44 args=args,
45 duration=duration,
46 thread_duration=duration),
47 async_slice_module.AsyncSlice(DEVICE_FRAME_END_CATEGORY,
48 DEVICE_FRAME_END_NAME,
49 start_time + offset,
50 args=args,
51 duration=duration))
52
53
54 def _AddSliceToThread(parent_thread, slice_item):
55 if isinstance(slice_item, slice_module.Slice):
56 parent_thread.PushSlice(slice_item)
57 elif isinstance(slice_item, async_slice_module.AsyncSlice):
58 parent_thread.AddAsyncSlice(slice_item)
59 else:
60 assert False, "Invalid Slice Item Type: %s" % type(slice_item)
61
62
63 class GPUTimelineTest(unittest.TestCase):
64 def GetResults(self, metric, model, renderer_thread, interaction_records):
65 results = test_page_test_results.TestPageTestResults(self)
66 metric.AddResults(model, renderer_thread, interaction_records, results)
67 return results
68
69 def testExpectedResults(self):
70 """Test a simply trace will output all expected results."""
71 model = model_module.TimelineModel()
72 test_thread = model.GetOrCreateProcess(1).GetOrCreateThread(2)
73 for slice_item in _CreateGPUSlices(test_thread, 'test_item', 100, 10):
74 _AddSliceToThread(test_thread, slice_item)
75 model.FinalizeImport()
76
77 metric = gpu_timeline.GPUTimelineMetric()
78 results = self.GetResults(metric, model=model, renderer_thread=test_thread,
79 interaction_records=INTERACTION_RECORDS)
80
81 results.AssertHasPageSpecificScalarValue(
82 'mean_frame_max', 'ms', 10)
83 results.AssertHasPageSpecificScalarValue(
84 'mean_frame_avg', 'ms', 10)
85 results.AssertHasPageSpecificScalarValue(
86 'mean_frame_stddev', 'ms', 0)
87 results.AssertHasPageSpecificScalarValue(
88 'mean_gpu_service-cpu_max', 'ms', 10)
89 results.AssertHasPageSpecificScalarValue(
90 'mean_gpu_service-cpu_avg', 'ms', 10)
91 results.AssertHasPageSpecificScalarValue(
92 'mean_gpu_service-cpu_stddev', 'ms', 0)
93 results.AssertHasPageSpecificScalarValue(
94 'mean_gpu_device-gpu_max', 'ms', 10)
95 results.AssertHasPageSpecificScalarValue(
96 'mean_gpu_device-gpu_avg', 'ms', 10)
97 results.AssertHasPageSpecificScalarValue(
98 'mean_gpu_device-gpu_stddev', 'ms', 0)
99
100 for tracked_name in gpu_timeline.TRACKED_NAMES.values():
101 results.AssertHasPageSpecificScalarValue(
102 tracked_name + '_service-cpu_max', 'ms', 0)
103 results.AssertHasPageSpecificScalarValue(
104 tracked_name + '_service-cpu_avg', 'ms', 0)
105 results.AssertHasPageSpecificScalarValue(
106 tracked_name + '_service-cpu_stddev', 'ms', 0)
107 results.AssertHasPageSpecificScalarValue(
108 tracked_name + '_device-gpu_max', 'ms', 0)
109 results.AssertHasPageSpecificScalarValue(
110 tracked_name + '_device-gpu_avg', 'ms', 0)
111 results.AssertHasPageSpecificScalarValue(
112 tracked_name + '_device-gpu_stddev', 'ms', 0)
113
114 def testNoDeviceTraceResults(self):
115 """Test expected results when missing device traces."""
116 model = model_module.TimelineModel()
117 test_thread = model.GetOrCreateProcess(1).GetOrCreateThread(2)
118 service_slice, _ = _CreateGPUSlices(test_thread, 'test_item', 100, 10)
119 _AddSliceToThread(test_thread, service_slice)
120 model.FinalizeImport()
121
122 metric = gpu_timeline.GPUTimelineMetric()
123 results = self.GetResults(metric, model=model, renderer_thread=test_thread,
124 interaction_records=INTERACTION_RECORDS)
125
126 results.AssertHasPageSpecificScalarValue(
127 'mean_frame_max', 'ms', 10)
128 results.AssertHasPageSpecificScalarValue(
129 'mean_frame_avg', 'ms', 10)
130 results.AssertHasPageSpecificScalarValue(
131 'mean_frame_stddev', 'ms', 0)
132 results.AssertHasPageSpecificScalarValue(
133 'mean_gpu_service-cpu_max', 'ms', 10)
134 results.AssertHasPageSpecificScalarValue(
135 'mean_gpu_service-cpu_avg', 'ms', 10)
136 results.AssertHasPageSpecificScalarValue(
137 'mean_gpu_service-cpu_stddev', 'ms', 0)
138 self.assertRaises(AssertionError, results.GetPageSpecificValueNamed,
139 'mean_gpu_device-gpu_max')
140 self.assertRaises(AssertionError, results.GetPageSpecificValueNamed,
141 'mean_gpu_device-gpu_avg')
142 self.assertRaises(AssertionError, results.GetPageSpecificValueNamed,
143 'mean_gpu_device-gpu_stddev')
144
145 for tracked_name in gpu_timeline.TRACKED_NAMES.values():
146 results.AssertHasPageSpecificScalarValue(
147 tracked_name + '_service-cpu_max', 'ms', 0)
148 results.AssertHasPageSpecificScalarValue(
149 tracked_name + '_service-cpu_avg', 'ms', 0)
150 results.AssertHasPageSpecificScalarValue(
151 tracked_name + '_service-cpu_stddev', 'ms', 0)
152 self.assertRaises(AssertionError, results.GetPageSpecificValueNamed,
153 tracked_name + '_device-gpu_max')
154 self.assertRaises(AssertionError, results.GetPageSpecificValueNamed,
155 tracked_name + '_device-gpu_avg')
156 self.assertRaises(AssertionError, results.GetPageSpecificValueNamed,
157 tracked_name + '_device-gpu_stddev')
158
159 def testFrameSeparation(self):
160 """Test frames are correctly calculated using the frame end marker."""
161 model = model_module.TimelineModel()
162 test_thread = model.GetOrCreateProcess(1).GetOrCreateThread(2)
163
164 # First frame is 10 seconds.
165 for slice_item in _CreateGPUSlices(test_thread, 'test_item', 100, 10):
166 _AddSliceToThread(test_thread, slice_item)
167
168 # Mark frame end.
169 for slice_item in _CreateFrameEndSlices(test_thread, 105, 5):
170 _AddSliceToThread(test_thread, slice_item)
171
172 # Second frame is 20 seconds.
173 for slice_item in _CreateGPUSlices(test_thread, 'test_item', 110, 20):
174 _AddSliceToThread(test_thread, slice_item)
175
176 model.FinalizeImport()
177
178 metric = gpu_timeline.GPUTimelineMetric()
179 results = self.GetResults(metric, model=model, renderer_thread=test_thread,
180 interaction_records=INTERACTION_RECORDS)
181
182 results.AssertHasPageSpecificScalarValue(
183 'mean_frame_max', 'ms', 20)
184 results.AssertHasPageSpecificScalarValue(
185 'mean_frame_avg', 'ms', 15)
186 results.AssertHasPageSpecificScalarValue(
187 'mean_frame_stddev', 'ms', 5)
188 results.AssertHasPageSpecificScalarValue(
189 'mean_gpu_service-cpu_max', 'ms', 20)
190 results.AssertHasPageSpecificScalarValue(
191 'mean_gpu_service-cpu_avg', 'ms', 15)
192 results.AssertHasPageSpecificScalarValue(
193 'mean_gpu_service-cpu_stddev', 'ms', 5)
194 results.AssertHasPageSpecificScalarValue(
195 'mean_gpu_device-gpu_max', 'ms', 20)
196 results.AssertHasPageSpecificScalarValue(
197 'mean_gpu_device-gpu_avg', 'ms', 15)
198 results.AssertHasPageSpecificScalarValue(
199 'mean_gpu_device-gpu_stddev', 'ms', 5)
200
201 def testFrameSeparationBeforeMarker(self):
202 """Test frames are correctly calculated using the frame end marker."""
203 model = model_module.TimelineModel()
204 test_thread = model.GetOrCreateProcess(1).GetOrCreateThread(2)
205
206 # Mark frame end.
207 for slice_item in _CreateFrameEndSlices(test_thread, 105, 5):
208 _AddSliceToThread(test_thread, slice_item)
209
210 # First frame is 10 seconds.
211 for slice_item in _CreateGPUSlices(test_thread, 'test_item', 100, 10):
212 _AddSliceToThread(test_thread, slice_item)
213
214 # Second frame is 20 seconds.
215 for slice_item in _CreateGPUSlices(test_thread, 'test_item', 110, 20):
216 _AddSliceToThread(test_thread, slice_item)
217
218 model.FinalizeImport()
219
220 metric = gpu_timeline.GPUTimelineMetric()
221 results = self.GetResults(metric, model=model, renderer_thread=test_thread,
222 interaction_records=INTERACTION_RECORDS)
223
224 results.AssertHasPageSpecificScalarValue(
225 'mean_frame_max', 'ms', 20)
226 results.AssertHasPageSpecificScalarValue(
227 'mean_frame_avg', 'ms', 15)
228 results.AssertHasPageSpecificScalarValue(
229 'mean_frame_stddev', 'ms', 5)
230
231 def testTrackedNameTraces(self):
232 """Be sure tracked names are being recorded correctly."""
233 self.assertGreater(len(gpu_timeline.TRACKED_NAMES), 0)
234
235 marker_name, result_name = gpu_timeline.TRACKED_NAMES.iteritems().next()
236
237 model = model_module.TimelineModel()
238 test_thread = model.GetOrCreateProcess(1).GetOrCreateThread(2)
239 for slice_item in _CreateGPUSlices(test_thread, marker_name, 100, 10):
240 _AddSliceToThread(test_thread, slice_item)
241 model.FinalizeImport()
242
243 metric = gpu_timeline.GPUTimelineMetric()
244 results = self.GetResults(metric, model=model, renderer_thread=test_thread,
245 interaction_records=INTERACTION_RECORDS)
246
247 results.AssertHasPageSpecificScalarValue(
248 result_name + '_service-cpu_max', 'ms', 10)
249 results.AssertHasPageSpecificScalarValue(
250 result_name + '_service-cpu_avg', 'ms', 10)
251 results.AssertHasPageSpecificScalarValue(
252 result_name + '_service-cpu_stddev', 'ms', 0)
253
254 def testTrackedNameWithContextIDTraces(self):
255 """Be sure tracked names with context IDs are recorded correctly."""
256 self.assertGreater(len(gpu_timeline.TRACKED_NAMES), 0)
257
258 marker_name, result_name = gpu_timeline.TRACKED_NAMES.iteritems().next()
259 context_id = '-0x1234'
260
261 model = model_module.TimelineModel()
262 test_thread = model.GetOrCreateProcess(1).GetOrCreateThread(2)
263 for slice_item in _CreateGPUSlices(test_thread, marker_name + context_id,
264 100, 10):
265 _AddSliceToThread(test_thread, slice_item)
266 model.FinalizeImport()
267
268 metric = gpu_timeline.GPUTimelineMetric()
269 results = self.GetResults(metric, model=model, renderer_thread=test_thread,
270 interaction_records=INTERACTION_RECORDS)
271
272 results.AssertHasPageSpecificScalarValue(
273 result_name + '_service-cpu_max', 'ms', 10)
274 results.AssertHasPageSpecificScalarValue(
275 result_name + '_service-cpu_avg', 'ms', 10)
276 results.AssertHasPageSpecificScalarValue(
277 result_name + '_service-cpu_stddev', 'ms', 0)
278
279 def testOutOfOrderDeviceTraces(self):
280 """Out of order device traces are still matched up to correct services."""
281 self.assertGreaterEqual(len(gpu_timeline.TRACKED_NAMES), 2)
282
283 tracked_names_iter = gpu_timeline.TRACKED_NAMES.iteritems()
284 marker1_name, result1_name = tracked_names_iter.next()
285 marker2_name, result2_name = tracked_names_iter.next()
286
287 model = model_module.TimelineModel()
288 test_thread = model.GetOrCreateProcess(1).GetOrCreateThread(2)
289
290 # marker1 lasts for 10 seconds.
291 service_item1, device_item1 = _CreateGPUSlices(test_thread, marker1_name,
292 100, 10)
293 # marker2 lasts for 20 seconds.
294 service_item2, device_item2 = _CreateGPUSlices(test_thread, marker2_name,
295 200, 20)
296
297 # Append out of order
298 _AddSliceToThread(test_thread, service_item1)
299 _AddSliceToThread(test_thread, service_item2)
300 _AddSliceToThread(test_thread, device_item2)
301 _AddSliceToThread(test_thread, device_item1)
302
303 model.FinalizeImport()
304
305 metric = gpu_timeline.GPUTimelineMetric()
306 results = self.GetResults(metric, model=model, renderer_thread=test_thread,
307 interaction_records=INTERACTION_RECORDS)
308
309 results.AssertHasPageSpecificScalarValue(
310 result1_name + '_service-cpu_max', 'ms', 10)
311 results.AssertHasPageSpecificScalarValue(
312 result1_name + '_service-cpu_avg', 'ms', 10)
313 results.AssertHasPageSpecificScalarValue(
314 result1_name + '_service-cpu_stddev', 'ms', 0)
315 results.AssertHasPageSpecificScalarValue(
316 result2_name + '_service-cpu_max', 'ms', 20)
317 results.AssertHasPageSpecificScalarValue(
318 result2_name + '_service-cpu_avg', 'ms', 20)
319 results.AssertHasPageSpecificScalarValue(
320 result2_name + '_service-cpu_stddev', 'ms', 0)
OLDNEW
« tools/perf/measurements/gpu_times.py ('K') | « tools/perf/metrics/gpu_timeline.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698