OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2014 the V8 project authors. All rights reserved. | 2 # Copyright 2014 the V8 project 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 """ | 6 """ |
7 Performance runner for d8. | 7 Performance runner for d8. |
8 | 8 |
9 Call e.g. with tools/run-perf.py --arch ia32 some_suite.json | 9 Call e.g. with tools/run-perf.py --arch ia32 some_suite.json |
10 | 10 |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
303 | 303 |
304 def ChangeCWD(self, suite_path): | 304 def ChangeCWD(self, suite_path): |
305 """Changes the cwd to to path defined in the current graph. | 305 """Changes the cwd to to path defined in the current graph. |
306 | 306 |
307 The tests are supposed to be relative to the suite configuration. | 307 The tests are supposed to be relative to the suite configuration. |
308 """ | 308 """ |
309 suite_dir = os.path.abspath(os.path.dirname(suite_path)) | 309 suite_dir = os.path.abspath(os.path.dirname(suite_path)) |
310 bench_dir = os.path.normpath(os.path.join(*self.path)) | 310 bench_dir = os.path.normpath(os.path.join(*self.path)) |
311 os.chdir(os.path.join(suite_dir, bench_dir)) | 311 os.chdir(os.path.join(suite_dir, bench_dir)) |
312 | 312 |
313 def GetCommandFlags(self): | 313 def GetCommandFlags(self, extra_flags=None): |
314 suffix = ["--"] + self.test_flags if self.test_flags else [] | 314 suffix = ["--"] + self.test_flags if self.test_flags else [] |
315 return self.flags + [self.main] + suffix | 315 return self.flags + (extra_flags or []) + [self.main] + suffix |
316 | 316 |
317 def GetCommand(self, shell_dir): | 317 def GetCommand(self, shell_dir, extra_flags=None): |
318 # TODO(machenbach): This requires +.exe if run on windows. | 318 # TODO(machenbach): This requires +.exe if run on windows. |
319 return [os.path.join(shell_dir, self.binary)] + self.GetCommandFlags() | 319 cmd = [os.path.join(shell_dir, self.binary)] |
320 return cmd + self.GetCommandFlags(extra_flags=extra_flags) | |
kjellander_chromium
2015/05/13 13:23:55
Do you have to pass them into GetCommandFlags beca
Michael Achenbach
2015/05/13 13:49:43
Yes they have to come before suffix as it contains
| |
320 | 321 |
321 def Run(self, runner): | 322 def Run(self, runner): |
322 """Iterates over several runs and handles the output for all traces.""" | 323 """Iterates over several runs and handles the output for all traces.""" |
323 for stdout in runner(): | 324 for stdout in runner(): |
324 for trace in self._children: | 325 for trace in self._children: |
325 trace.ConsumeOutput(stdout) | 326 trace.ConsumeOutput(stdout) |
326 res = reduce(lambda r, t: r + t.GetResults(), self._children, Results()) | 327 res = reduce(lambda r, t: r + t.GetResults(), self._children, Results()) |
327 | 328 |
328 if not res.traces or not self.total: | 329 if not res.traces or not self.total: |
329 return res | 330 return res |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
467 def GetPlatform(options): | 468 def GetPlatform(options): |
468 if options.arch.startswith("android"): | 469 if options.arch.startswith("android"): |
469 return AndroidPlatform(options) | 470 return AndroidPlatform(options) |
470 else: | 471 else: |
471 return DesktopPlatform(options) | 472 return DesktopPlatform(options) |
472 | 473 |
473 | 474 |
474 class DesktopPlatform(Platform): | 475 class DesktopPlatform(Platform): |
475 def __init__(self, options): | 476 def __init__(self, options): |
476 self.shell_dir = options.shell_dir | 477 self.shell_dir = options.shell_dir |
478 self.extra_flags = options.extra_flags.split() | |
kjellander_chromium
2015/05/13 13:23:55
Move this whole constructor to Platform class to r
Michael Achenbach
2015/05/13 13:49:43
Will do. Followup coming...
| |
477 | 479 |
478 def PreExecution(self): | 480 def PreExecution(self): |
479 pass | 481 pass |
480 | 482 |
481 def PostExecution(self): | 483 def PostExecution(self): |
482 pass | 484 pass |
483 | 485 |
484 def PreTests(self, node, path): | 486 def PreTests(self, node, path): |
485 if isinstance(node, Runnable): | 487 if isinstance(node, Runnable): |
486 node.ChangeCWD(path) | 488 node.ChangeCWD(path) |
487 | 489 |
488 def Run(self, runnable, count): | 490 def Run(self, runnable, count): |
489 try: | 491 try: |
490 output = commands.Execute(runnable.GetCommand(self.shell_dir), | 492 output = commands.Execute( |
491 timeout=runnable.timeout) | 493 runnable.GetCommand(self.shell_dir, self.extra_flags), |
494 timeout=runnable.timeout, | |
495 ) | |
492 except OSError as e: | 496 except OSError as e: |
493 print ">>> OSError (#%d):" % (count + 1) | 497 print ">>> OSError (#%d):" % (count + 1) |
494 print e | 498 print e |
495 return "" | 499 return "" |
496 print ">>> Stdout (#%d):" % (count + 1) | 500 print ">>> Stdout (#%d):" % (count + 1) |
497 print output.stdout | 501 print output.stdout |
498 if output.stderr: # pragma: no cover | 502 if output.stderr: # pragma: no cover |
499 # Print stderr for debugging. | 503 # Print stderr for debugging. |
500 print ">>> Stderr (#%d):" % (count + 1) | 504 print ">>> Stderr (#%d):" % (count + 1) |
501 print output.stderr | 505 print output.stderr |
502 if output.timed_out: | 506 if output.timed_out: |
503 print ">>> Test timed out after %ss." % runnable.timeout | 507 print ">>> Test timed out after %ss." % runnable.timeout |
504 return output.stdout | 508 return output.stdout |
505 | 509 |
506 | 510 |
507 class AndroidPlatform(Platform): # pragma: no cover | 511 class AndroidPlatform(Platform): # pragma: no cover |
508 DEVICE_DIR = "/data/local/tmp/v8/" | 512 DEVICE_DIR = "/data/local/tmp/v8/" |
509 | 513 |
510 def __init__(self, options): | 514 def __init__(self, options): |
511 self.shell_dir = options.shell_dir | 515 self.shell_dir = options.shell_dir |
516 self.extra_flags = options.extra_flags.split() | |
512 LoadAndroidBuildTools(options.android_build_tools) | 517 LoadAndroidBuildTools(options.android_build_tools) |
kjellander_chromium
2015/05/13 13:23:55
Then this would just invoke the superclass constru
| |
513 | 518 |
514 if not options.device: | 519 if not options.device: |
515 # Detect attached device if not specified. | 520 # Detect attached device if not specified. |
516 devices = pylib.android_commands.GetAttachedDevices( | 521 devices = pylib.android_commands.GetAttachedDevices( |
517 hardware=True, emulator=False, offline=False) | 522 hardware=True, emulator=False, offline=False) |
518 assert devices and len(devices) == 1, ( | 523 assert devices and len(devices) == 1, ( |
519 "None or multiple devices detected. Please specify the device on " | 524 "None or multiple devices detected. Please specify the device on " |
520 "the command-line with --device") | 525 "the command-line with --device") |
521 options.device = devices[0] | 526 options.device = devices[0] |
522 adb_wrapper = pylib.android_commands.AndroidCommands(options.device) | 527 adb_wrapper = pylib.android_commands.AndroidCommands(options.device) |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
589 | 594 |
590 if isinstance(node, Runnable): | 595 if isinstance(node, Runnable): |
591 self._PushFile(bench_abs, node.main, bench_rel) | 596 self._PushFile(bench_abs, node.main, bench_rel) |
592 for resource in node.resources: | 597 for resource in node.resources: |
593 self._PushFile(bench_abs, resource, bench_rel) | 598 self._PushFile(bench_abs, resource, bench_rel) |
594 | 599 |
595 def Run(self, runnable, count): | 600 def Run(self, runnable, count): |
596 cache = cache_control.CacheControl(self.device) | 601 cache = cache_control.CacheControl(self.device) |
597 cache.DropRamCaches() | 602 cache.DropRamCaches() |
598 binary_on_device = AndroidPlatform.DEVICE_DIR + runnable.binary | 603 binary_on_device = AndroidPlatform.DEVICE_DIR + runnable.binary |
599 cmd = [binary_on_device] + runnable.GetCommandFlags() | 604 cmd = [binary_on_device] + runnable.GetCommandFlags(self.extra_flags) |
600 | 605 |
601 # Relative path to benchmark directory. | 606 # Relative path to benchmark directory. |
602 if runnable.path: | 607 if runnable.path: |
603 bench_rel = os.path.normpath(os.path.join(*runnable.path)) | 608 bench_rel = os.path.normpath(os.path.join(*runnable.path)) |
604 else: | 609 else: |
605 bench_rel = "." | 610 bench_rel = "." |
606 | 611 |
607 try: | 612 try: |
608 output = self.device.RunShellCommand( | 613 output = self.device.RunShellCommand( |
609 cmd, | 614 cmd, |
(...skipping 19 matching lines...) Expand all Loading... | |
629 parser.add_option("--arch", | 634 parser.add_option("--arch", |
630 help=("The architecture to run tests for, " | 635 help=("The architecture to run tests for, " |
631 "'auto' or 'native' for auto-detect"), | 636 "'auto' or 'native' for auto-detect"), |
632 default="x64") | 637 default="x64") |
633 parser.add_option("--buildbot", | 638 parser.add_option("--buildbot", |
634 help="Adapt to path structure used on buildbots", | 639 help="Adapt to path structure used on buildbots", |
635 default=False, action="store_true") | 640 default=False, action="store_true") |
636 parser.add_option("--device", | 641 parser.add_option("--device", |
637 help="The device ID to run Android tests on. If not given " | 642 help="The device ID to run Android tests on. If not given " |
638 "it will be autodetected.") | 643 "it will be autodetected.") |
644 parser.add_option("--extra-flags", | |
645 help="Additional flags to pass to the test executable", | |
646 default="") | |
639 parser.add_option("--json-test-results", | 647 parser.add_option("--json-test-results", |
640 help="Path to a file for storing json results.") | 648 help="Path to a file for storing json results.") |
641 parser.add_option("--outdir", help="Base directory with compile output", | 649 parser.add_option("--outdir", help="Base directory with compile output", |
642 default="out") | 650 default="out") |
643 (options, args) = parser.parse_args(args) | 651 (options, args) = parser.parse_args(args) |
644 | 652 |
645 if len(args) == 0: # pragma: no cover | 653 if len(args) == 0: # pragma: no cover |
646 parser.print_help() | 654 parser.print_help() |
647 return 1 | 655 return 1 |
648 | 656 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
716 | 724 |
717 if options.json_test_results: | 725 if options.json_test_results: |
718 results.WriteToFile(options.json_test_results) | 726 results.WriteToFile(options.json_test_results) |
719 else: # pragma: no cover | 727 else: # pragma: no cover |
720 print results | 728 print results |
721 | 729 |
722 return min(1, len(results.errors)) | 730 return min(1, len(results.errors)) |
723 | 731 |
724 if __name__ == "__main__": # pragma: no cover | 732 if __name__ == "__main__": # pragma: no cover |
725 sys.exit(Main(sys.argv[1:])) | 733 sys.exit(Main(sys.argv[1:])) |
OLD | NEW |