 Chromium Code Reviews
 Chromium Code Reviews Issue 1659483003:
  [tools] Flexible perf runner path.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 1659483003:
  [tools] Flexible perf runner path.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| 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 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 343 """Represents a node in the suite tree structure.""" | 343 """Represents a node in the suite tree structure.""" | 
| 344 def __init__(self, *args): | 344 def __init__(self, *args): | 
| 345 self._children = [] | 345 self._children = [] | 
| 346 | 346 | 
| 347 def AppendChild(self, child): | 347 def AppendChild(self, child): | 
| 348 self._children.append(child) | 348 self._children.append(child) | 
| 349 | 349 | 
| 350 | 350 | 
| 351 class DefaultSentinel(Node): | 351 class DefaultSentinel(Node): | 
| 352 """Fake parent node with all default values.""" | 352 """Fake parent node with all default values.""" | 
| 353 def __init__(self): | 353 def __init__(self, binary = "d8"): | 
| 354 super(DefaultSentinel, self).__init__() | 354 super(DefaultSentinel, self).__init__() | 
| 355 self.binary = "d8" | 355 self.binary = binary | 
| 356 self.run_count = 10 | 356 self.run_count = 10 | 
| 357 self.timeout = 60 | 357 self.timeout = 60 | 
| 358 self.path = [] | 358 self.path = [] | 
| 359 self.graphs = [] | 359 self.graphs = [] | 
| 360 self.flags = [] | 360 self.flags = [] | 
| 361 self.test_flags = [] | 361 self.test_flags = [] | 
| 362 self.resources = [] | 362 self.resources = [] | 
| 363 self.results_regexp = None | 363 self.results_regexp = None | 
| 364 self.stddev_regexp = None | 364 self.stddev_regexp = None | 
| 365 self.units = "score" | 365 self.units = "score" | 
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 536 # This is a generic suite definition. It is either a runnable executable | 536 # This is a generic suite definition. It is either a runnable executable | 
| 537 # or has a main js file. | 537 # or has a main js file. | 
| 538 return RunnableGenericConfig(suite, parent, arch) | 538 return RunnableGenericConfig(suite, parent, arch) | 
| 539 elif suite.get("tests"): | 539 elif suite.get("tests"): | 
| 540 # This is neither a leaf nor a runnable. | 540 # This is neither a leaf nor a runnable. | 
| 541 return GraphConfig(suite, parent, arch) | 541 return GraphConfig(suite, parent, arch) | 
| 542 else: # pragma: no cover | 542 else: # pragma: no cover | 
| 543 raise Exception("Invalid suite configuration.") | 543 raise Exception("Invalid suite configuration.") | 
| 544 | 544 | 
| 545 | 545 | 
| 546 def BuildGraphConfigs(suite, arch, parent=None): | 546 def BuildGraphConfigs(suite, arch, parent): | 
| 547 """Builds a tree structure of graph objects that corresponds to the suite | 547 """Builds a tree structure of graph objects that corresponds to the suite | 
| 548 configuration. | 548 configuration. | 
| 549 """ | 549 """ | 
| 550 parent = parent or DefaultSentinel() | |
| 551 | 550 | 
| 552 # TODO(machenbach): Implement notion of cpu type? | 551 # TODO(machenbach): Implement notion of cpu type? | 
| 553 if arch not in suite.get("archs", SUPPORTED_ARCHS): | 552 if arch not in suite.get("archs", SUPPORTED_ARCHS): | 
| 554 return None | 553 return None | 
| 555 | 554 | 
| 556 graph = MakeGraphConfig(suite, arch, parent) | 555 graph = MakeGraphConfig(suite, arch, parent) | 
| 557 for subsuite in suite.get("tests", []): | 556 for subsuite in suite.get("tests", []): | 
| 558 BuildGraphConfigs(subsuite, arch, graph) | 557 BuildGraphConfigs(subsuite, arch, graph) | 
| 559 parent.AppendChild(graph) | 558 parent.AppendChild(graph) | 
| 560 return graph | 559 return graph | 
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 806 default="") | 805 default="") | 
| 807 parser.add_option("--json-test-results", | 806 parser.add_option("--json-test-results", | 
| 808 help="Path to a file for storing json results.") | 807 help="Path to a file for storing json results.") | 
| 809 parser.add_option("--json-test-results-no-patch", | 808 parser.add_option("--json-test-results-no-patch", | 
| 810 help="Path to a file for storing json results from run " | 809 help="Path to a file for storing json results from run " | 
| 811 "without patch.") | 810 "without patch.") | 
| 812 parser.add_option("--outdir", help="Base directory with compile output", | 811 parser.add_option("--outdir", help="Base directory with compile output", | 
| 813 default="out") | 812 default="out") | 
| 814 parser.add_option("--outdir-no-patch", | 813 parser.add_option("--outdir-no-patch", | 
| 815 help="Base directory with compile output without patch") | 814 help="Base directory with compile output without patch") | 
| 815 parser.add_option("--binary-override-path", | |
| 816 help="JavaScript engine binary. By default, d8 under " | |
| 817 "architecture-specific build dir. " | |
| 818 "Not supported in conjunction with outdir-no-patch.") | |
| 819 | |
| 816 (options, args) = parser.parse_args(args) | 820 (options, args) = parser.parse_args(args) | 
| 817 | 821 | 
| 818 if len(args) == 0: # pragma: no cover | 822 if len(args) == 0: # pragma: no cover | 
| 819 parser.print_help() | 823 parser.print_help() | 
| 820 return 1 | 824 return 1 | 
| 821 | 825 | 
| 822 if options.arch in ["auto", "native"]: # pragma: no cover | 826 if options.arch in ["auto", "native"]: # pragma: no cover | 
| 823 options.arch = ARCH_GUESS | 827 options.arch = ARCH_GUESS | 
| 824 | 828 | 
| 825 if not options.arch in SUPPORTED_ARCHS: # pragma: no cover | 829 if not options.arch in SUPPORTED_ARCHS: # pragma: no cover | 
| (...skipping 10 matching lines...) Expand all Loading... | |
| 836 "patch must be specified.") | 840 "patch must be specified.") | 
| 837 return 1 | 841 return 1 | 
| 838 | 842 | 
| 839 workspace = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) | 843 workspace = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) | 
| 840 | 844 | 
| 841 if options.buildbot: | 845 if options.buildbot: | 
| 842 build_config = "Release" | 846 build_config = "Release" | 
| 843 else: | 847 else: | 
| 844 build_config = "%s.release" % options.arch | 848 build_config = "%s.release" % options.arch | 
| 845 | 849 | 
| 846 options.shell_dir = os.path.join(workspace, options.outdir, build_config) | 850 if options.binary_override_path == None: | 
| 851 options.shell_dir = os.path.join(workspace, options.outdir, build_config) | |
| 852 default_binary_name = "d8" | |
| 853 else: | |
| 854 if not os.path.isfile(options.binary_override_path): | |
| 855 print "binary-override-path must be a file name" | |
| 856 return 1 | |
| 857 if options.outdir_no_patch: | |
| 858 print "specify either binary-override-path or shell-dir-no-patch" | |
| 
Michael Achenbach
2016/02/01 20:02:24
nit: The option is called outdir-no-patch.
 
Mircea Trofin
2016/02/01 20:25:53
Done.
 | |
| 859 return 1 | |
| 860 options.shell_dir = os.path.dirname(options.binary_override_path) | |
| 861 default_binary_name = os.path.basename(options.binary_override_path) | |
| 847 | 862 | 
| 848 if options.outdir_no_patch: | 863 if options.outdir_no_patch: | 
| 849 options.shell_dir_no_patch = os.path.join( | 864 options.shell_dir_no_patch = os.path.join( | 
| 850 workspace, options.outdir_no_patch, build_config) | 865 workspace, options.outdir_no_patch, build_config) | 
| 851 else: | 866 else: | 
| 852 options.shell_dir_no_patch = None | 867 options.shell_dir_no_patch = None | 
| 853 | 868 | 
| 854 platform = Platform.GetPlatform(options) | 869 platform = Platform.GetPlatform(options) | 
| 855 | 870 | 
| 856 results = Results() | 871 results = Results() | 
| 857 results_no_patch = Results() | 872 results_no_patch = Results() | 
| 858 for path in args: | 873 for path in args: | 
| 859 path = os.path.abspath(path) | 874 path = os.path.abspath(path) | 
| 860 | 875 | 
| 861 if not os.path.exists(path): # pragma: no cover | 876 if not os.path.exists(path): # pragma: no cover | 
| 862 results.errors.append("Configuration file %s does not exist." % path) | 877 results.errors.append("Configuration file %s does not exist." % path) | 
| 863 continue | 878 continue | 
| 864 | 879 | 
| 865 with open(path) as f: | 880 with open(path) as f: | 
| 866 suite = json.loads(f.read()) | 881 suite = json.loads(f.read()) | 
| 867 | 882 | 
| 868 # If no name is given, default to the file name without .json. | 883 # If no name is given, default to the file name without .json. | 
| 869 suite.setdefault("name", os.path.splitext(os.path.basename(path))[0]) | 884 suite.setdefault("name", os.path.splitext(os.path.basename(path))[0]) | 
| 870 | 885 | 
| 871 # Setup things common to one test suite. | 886 # Setup things common to one test suite. | 
| 872 platform.PreExecution() | 887 platform.PreExecution() | 
| 873 | 888 | 
| 874 # Build the graph/trace tree structure. | 889 # Build the graph/trace tree structure. | 
| 875 root = BuildGraphConfigs(suite, options.arch) | 890 default_parent = DefaultSentinel(default_binary_name) | 
| 891 root = BuildGraphConfigs(suite, options.arch, default_parent) | |
| 876 | 892 | 
| 877 # Callback to be called on each node on traversal. | 893 # Callback to be called on each node on traversal. | 
| 878 def NodeCB(node): | 894 def NodeCB(node): | 
| 879 platform.PreTests(node, path) | 895 platform.PreTests(node, path) | 
| 880 | 896 | 
| 881 # Traverse graph/trace tree and interate over all runnables. | 897 # Traverse graph/trace tree and interate over all runnables. | 
| 882 for runnable in FlattenRunnables(root, NodeCB): | 898 for runnable in FlattenRunnables(root, NodeCB): | 
| 883 print ">>> Running suite: %s" % "/".join(runnable.graphs) | 899 print ">>> Running suite: %s" % "/".join(runnable.graphs) | 
| 884 | 900 | 
| 885 def Runner(): | 901 def Runner(): | 
| (...skipping 17 matching lines...) Expand all Loading... | |
| 903 | 919 | 
| 904 if options.json_test_results_no_patch: | 920 if options.json_test_results_no_patch: | 
| 905 results_no_patch.WriteToFile(options.json_test_results_no_patch) | 921 results_no_patch.WriteToFile(options.json_test_results_no_patch) | 
| 906 else: # pragma: no cover | 922 else: # pragma: no cover | 
| 907 print results_no_patch | 923 print results_no_patch | 
| 908 | 924 | 
| 909 return min(1, len(results.errors)) | 925 return min(1, len(results.errors)) | 
| 910 | 926 | 
| 911 if __name__ == "__main__": # pragma: no cover | 927 if __name__ == "__main__": # pragma: no cover | 
| 912 sys.exit(Main(sys.argv[1:])) | 928 sys.exit(Main(sys.argv[1:])) | 
| OLD | NEW |