OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Basic pyauto performance tests. | 6 """Basic pyauto performance tests. |
7 | 7 |
8 For tests that need to be run for multiple iterations (e.g., so that average | 8 For tests that need to be run for multiple iterations (e.g., so that average |
9 and standard deviation values can be reported), the default number of iterations | 9 and standard deviation values can be reported), the default number of iterations |
10 run for each of these tests is specified by |_DEFAULT_NUM_ITERATIONS|. | 10 run for each of these tests is specified by |_DEFAULT_NUM_ITERATIONS|. |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 times, in milliseconds as a float. | 249 times, in milliseconds as a float. |
250 """ | 250 """ |
251 assert callable(python_command) | 251 assert callable(python_command) |
252 def RunCommand(): | 252 def RunCommand(): |
253 for _ in range(num_invocations): | 253 for _ in range(num_invocations): |
254 python_command() | 254 python_command() |
255 timer = timeit.Timer(stmt=RunCommand) | 255 timer = timeit.Timer(stmt=RunCommand) |
256 return timer.timeit(number=1) * 1000 # Convert seconds to milliseconds. | 256 return timer.timeit(number=1) * 1000 # Convert seconds to milliseconds. |
257 | 257 |
258 def _OutputPerfForStandaloneGraphing(self, graph_name, description, value, | 258 def _OutputPerfForStandaloneGraphing(self, graph_name, description, value, |
259 units, units_x): | 259 units, units_x, is_stacked): |
260 """Outputs perf measurement data to a local folder to be graphed. | 260 """Outputs perf measurement data to a local folder to be graphed. |
261 | 261 |
262 This function only applies to Chrome desktop, and assumes that environment | 262 This function only applies to Chrome desktop, and assumes that environment |
263 variable 'LOCAL_PERF_DIR' has been specified and refers to a valid directory | 263 variable 'LOCAL_PERF_DIR' has been specified and refers to a valid directory |
264 on the local machine. | 264 on the local machine. |
265 | 265 |
266 Args: | 266 Args: |
267 graph_name: A string name for the graph associated with this performance | 267 graph_name: A string name for the graph associated with this performance |
268 value. | 268 value. |
269 description: A string description of the performance value. Should not | 269 description: A string description of the performance value. Should not |
270 include spaces. | 270 include spaces. |
271 value: Either a single numeric value representing a performance | 271 value: Either a single numeric value representing a performance |
272 measurement, or else a list of (x, y) tuples representing one or more | 272 measurement, or else a list of (x, y) tuples representing one or more |
273 long-running performance measurements, where 'x' is an x-axis value | 273 long-running performance measurements, where 'x' is an x-axis value |
274 (such as an iteration number) and 'y' is the corresponding performance | 274 (such as an iteration number) and 'y' is the corresponding performance |
275 measurement. If a list of tuples is given, then the |units_x| | 275 measurement. If a list of tuples is given, then the |units_x| |
276 argument must also be specified. | 276 argument must also be specified. |
277 units: A string representing the units of the performance measurement(s). | 277 units: A string representing the units of the performance measurement(s). |
278 Should not include spaces. | 278 Should not include spaces. |
279 units_x: A string representing the units of the x-axis values associated | 279 units_x: A string representing the units of the x-axis values associated |
280 with the performance measurements, such as 'iteration' if the x values | 280 with the performance measurements, such as 'iteration' if the x values |
281 are iteration numbers. If this argument is specified, then the | 281 are iteration numbers. If this argument is specified, then the |
282 |value| argument must be a list of (x, y) tuples. | 282 |value| argument must be a list of (x, y) tuples. |
| 283 is_stacked: True to draw a "stacked" graph. First-come values are |
| 284 stacked at bottom by default. |
283 """ | 285 """ |
284 revision_num_file = os.path.join(self._local_perf_dir, 'last_revision.dat') | 286 revision_num_file = os.path.join(self._local_perf_dir, 'last_revision.dat') |
285 if os.path.exists(revision_num_file): | 287 if os.path.exists(revision_num_file): |
286 with open(revision_num_file) as f: | 288 with open(revision_num_file) as f: |
287 revision = int(f.read()) | 289 revision = int(f.read()) |
288 else: | 290 else: |
289 revision = 0 | 291 revision = 0 |
290 | 292 |
291 if not self._seen_graph_lines: | 293 if not self._seen_graph_lines: |
292 # We're about to output data for a new test run. | 294 # We're about to output data for a new test run. |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 if not description in new_line['traces']: | 342 if not description in new_line['traces']: |
341 new_line['traces'][description] = [] | 343 new_line['traces'][description] = [] |
342 for x_value, y_value in value: | 344 for x_value, y_value in value: |
343 new_line['traces'][description].append([str(x_value), str(y_value)]) | 345 new_line['traces'][description].append([str(x_value), str(y_value)]) |
344 else: | 346 else: |
345 new_line = { | 347 new_line = { |
346 'rev': revision, | 348 'rev': revision, |
347 'traces': { description: [str(value), str(0.0)] } | 349 'traces': { description: [str(value), str(0.0)] } |
348 } | 350 } |
349 | 351 |
| 352 if is_stacked: |
| 353 new_line['stack'] = True |
| 354 if 'stack_order' not in new_line: |
| 355 new_line['stack_order'] = [] |
| 356 if description not in new_line['stack_order']: |
| 357 new_line['stack_order'].append(description) |
| 358 |
350 if seen_key in self._seen_graph_lines: | 359 if seen_key in self._seen_graph_lines: |
351 # Update results for the most recent revision. | 360 # Update results for the most recent revision. |
352 existing_lines[0] = new_line | 361 existing_lines[0] = new_line |
353 else: | 362 else: |
354 # New results for a new revision. | 363 # New results for a new revision. |
355 existing_lines.insert(0, new_line) | 364 existing_lines.insert(0, new_line) |
356 self._seen_graph_lines[seen_key] = True | 365 self._seen_graph_lines[seen_key] = True |
357 | 366 |
358 existing_lines = map(simplejson.dumps, existing_lines) | 367 existing_lines = map(simplejson.dumps, existing_lines) |
359 with open(data_file, 'w') as f: | 368 with open(data_file, 'w') as f: |
360 f.write('\n'.join(existing_lines)) | 369 f.write('\n'.join(existing_lines)) |
361 os.chmod(data_file, 0755) | 370 os.chmod(data_file, 0755) |
362 | 371 |
363 with open(revision_num_file, 'w') as f: | 372 with open(revision_num_file, 'w') as f: |
364 f.write(str(revision)) | 373 f.write(str(revision)) |
365 | 374 |
366 def _OutputPerfGraphValue(self, description, value, units, | 375 def _OutputPerfGraphValue(self, description, value, units, |
367 graph_name, units_x=None): | 376 graph_name, units_x=None, is_stacked=False): |
368 """Outputs a performance value to have it graphed on the performance bots. | 377 """Outputs a performance value to have it graphed on the performance bots. |
369 | 378 |
370 The output format differs, depending on whether the current platform is | 379 The output format differs, depending on whether the current platform is |
371 Chrome desktop or ChromeOS. | 380 Chrome desktop or ChromeOS. |
372 | 381 |
373 For ChromeOS, the performance bots have a 30-character limit on the length | 382 For ChromeOS, the performance bots have a 30-character limit on the length |
374 of the key associated with a performance value. A key on ChromeOS is | 383 of the key associated with a performance value. A key on ChromeOS is |
375 considered to be of the form "units_description" (for example, | 384 considered to be of the form "units_description" (for example, |
376 "milliseconds_NewTabPage"), and is created from the |units| and | 385 "milliseconds_NewTabPage"), and is created from the |units| and |
377 |description| passed as input to this function. Any characters beyond the | 386 |description| passed as input to this function. Any characters beyond the |
(...skipping 10 matching lines...) Expand all Loading... |
388 corresponding performance measurement. If a list of tuples is given, | 397 corresponding performance measurement. If a list of tuples is given, |
389 the |units_x| argument must also be specified. | 398 the |units_x| argument must also be specified. |
390 units: A string representing the units of the performance measurement(s). | 399 units: A string representing the units of the performance measurement(s). |
391 Should not include spaces. | 400 Should not include spaces. |
392 graph_name: A string name for the graph associated with this performance | 401 graph_name: A string name for the graph associated with this performance |
393 value. Only used on Chrome desktop. | 402 value. Only used on Chrome desktop. |
394 units_x: A string representing the units of the x-axis values associated | 403 units_x: A string representing the units of the x-axis values associated |
395 with the performance measurements, such as 'iteration' if the x values | 404 with the performance measurements, such as 'iteration' if the x values |
396 are iteration numbers. If this argument is specified, then the | 405 are iteration numbers. If this argument is specified, then the |
397 |value| argument must be a list of (x, y) tuples. | 406 |value| argument must be a list of (x, y) tuples. |
| 407 is_stacked: True to draw a "stacked" graph. First-come values are |
| 408 stacked at bottom by default. |
398 """ | 409 """ |
399 if (isinstance(value, list) and value[0] is not None and | 410 if (isinstance(value, list) and value[0] is not None and |
400 isinstance(value[0], tuple)): | 411 isinstance(value[0], tuple)): |
401 assert units_x | 412 assert units_x |
402 if units_x: | 413 if units_x: |
403 assert isinstance(value, list) | 414 assert isinstance(value, list) |
404 | 415 |
405 if self.IsChromeOS(): | 416 if self.IsChromeOS(): |
406 # ChromeOS results don't support lists. | 417 # ChromeOS results don't support lists. |
407 if (isinstance(value, list) and value[0] is not None and | 418 if (isinstance(value, list) and value[0] is not None and |
(...skipping 11 matching lines...) Expand all Loading... |
419 perf_key = '%s_%s' % (units, description) | 430 perf_key = '%s_%s' % (units, description) |
420 if len(perf_key) > 30: | 431 if len(perf_key) > 30: |
421 logging.warning('The description "%s" will be truncated to "%s" ' | 432 logging.warning('The description "%s" will be truncated to "%s" ' |
422 '(length 30) when added to the autotest database.', | 433 '(length 30) when added to the autotest database.', |
423 perf_key, perf_key[:30]) | 434 perf_key, perf_key[:30]) |
424 print '\n%s(\'%s\', %f)%s' % (self._PERF_OUTPUT_MARKER_PRE, | 435 print '\n%s(\'%s\', %f)%s' % (self._PERF_OUTPUT_MARKER_PRE, |
425 perf_key, value, | 436 perf_key, value, |
426 self._PERF_OUTPUT_MARKER_POST) | 437 self._PERF_OUTPUT_MARKER_POST) |
427 sys.stdout.flush() | 438 sys.stdout.flush() |
428 else: | 439 else: |
| 440 # TODO(dmikurube): Support stacked graphs in PrintPerfResult. |
| 441 # See http://crbug.com/122119. |
429 if units_x: | 442 if units_x: |
430 pyauto_utils.PrintPerfResult(graph_name, description, value, | 443 pyauto_utils.PrintPerfResult(graph_name, description, value, |
431 units + ' ' + units_x) | 444 units + ' ' + units_x) |
432 else: | 445 else: |
433 pyauto_utils.PrintPerfResult(graph_name, description, value, units) | 446 pyauto_utils.PrintPerfResult(graph_name, description, value, units) |
434 | 447 |
435 if self._local_perf_dir: | 448 if self._local_perf_dir: |
436 self._OutputPerfForStandaloneGraphing( | 449 self._OutputPerfForStandaloneGraphing( |
437 graph_name, description, value, units, units_x) | 450 graph_name, description, value, units, units_x, is_stacked) |
438 | 451 |
439 def _OutputEventForStandaloneGraphing(self, description, event_list): | 452 def _OutputEventForStandaloneGraphing(self, description, event_list): |
440 """Outputs event information to a local folder to be graphed. | 453 """Outputs event information to a local folder to be graphed. |
441 | 454 |
442 See function _OutputEventGraphValue below for a description of an event. | 455 See function _OutputEventGraphValue below for a description of an event. |
443 | 456 |
444 This function only applies to Chrome Endure tests running on Chrome desktop, | 457 This function only applies to Chrome Endure tests running on Chrome desktop, |
445 and assumes that environment variable 'LOCAL_PERF_DIR' has been specified | 458 and assumes that environment variable 'LOCAL_PERF_DIR' has been specified |
446 and refers to a valid directory on the local machine. | 459 and refers to a valid directory on the local machine. |
447 | 460 |
(...skipping 2206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2654 """Identifies the port number to which the server is currently bound. | 2667 """Identifies the port number to which the server is currently bound. |
2655 | 2668 |
2656 Returns: | 2669 Returns: |
2657 The numeric port number to which the server is currently bound. | 2670 The numeric port number to which the server is currently bound. |
2658 """ | 2671 """ |
2659 return self._server.server_address[1] | 2672 return self._server.server_address[1] |
2660 | 2673 |
2661 | 2674 |
2662 if __name__ == '__main__': | 2675 if __name__ == '__main__': |
2663 pyauto_functional.Main() | 2676 pyauto_functional.Main() |
OLD | NEW |