| #!/usr/bin/env python3 |
| # |
| # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| # for details. All rights reserved. Use of this source code is governed by a |
| # BSD-style license that can be found in the LICENSE file. |
| |
| # Simple wrapper for running benchmarks. |
| |
| import getopt |
| import optparse |
| import os |
| from os.path import join, dirname, realpath, abspath |
| import subprocess |
| import sys |
| import utils |
| import re |
| |
| HOST_OS = utils.GuessOS() |
| HOST_CPUS = utils.GuessCpus() |
| |
| |
| # Returns whether 'bench' matches any element in the 'filt' list. |
| def match(bench, filt): |
| bench = bench.lower() |
| for element in filt: |
| if element.search(bench): |
| return True |
| return False |
| |
| |
| def GetBenchmarkFile(path): |
| benchmark_root_path = [dirname(sys.argv[0]), '..', '..'] + ['benchmarks'] |
| return realpath(os.path.sep.join(benchmark_root_path + path)) |
| |
| |
| def ReadBenchmarkList(mode, path, core): |
| filename = GetBenchmarkFile([path]) |
| benchmarks = dict() |
| with open(filename) as infile: |
| exec(infile.read(), benchmarks) |
| if (mode == "release") and not core: |
| return benchmarks['SUPPORTED_BENCHMARKS'] |
| else: |
| return benchmarks['SUPPORTED_CORE_BENCHMARKS'] |
| |
| |
| def BuildOptions(): |
| result = optparse.OptionParser() |
| result.add_option( |
| "-m", |
| "--mode", |
| help='Build variants (comma-separated).', |
| metavar='[all,debug,release]', |
| default='release') |
| result.add_option( |
| "-v", |
| "--verbose", |
| help='Verbose output.', |
| default=False, |
| action="store_true") |
| result.add_option( |
| "-c", |
| "--core", |
| help='Run only core benchmarks.', |
| default=False, |
| action="store_true") |
| result.add_option( |
| "--arch", |
| help='Target architectures (comma-separated).', |
| metavar='[all,ia32,x64,simarm,arm,dartc]', |
| default=utils.GuessArchitecture()) |
| result.add_option( |
| "--executable", |
| help='Virtual machine to execute.', |
| metavar='[dart, (path to dart binary)]', |
| default=None) |
| result.add_option( |
| "-w", |
| "--warmup", |
| help='Only run the warmup period.', |
| default=False, |
| action="store_true") |
| return result |
| |
| |
| def ProcessOptions(options): |
| if options.arch == 'all': |
| options.arch = 'ia32,x64,simarm,dartc' |
| if options.mode == 'all': |
| options.mode = 'debug,release' |
| options.mode = options.mode.split(',') |
| options.arch = options.arch.split(',') |
| for mode in options.mode: |
| if not mode in ['debug', 'release']: |
| print("Unknown mode %s" % mode) |
| return False |
| for arch in options.arch: |
| if not arch in ['ia32', 'x64', 'simarm', 'arm', 'dartc']: |
| print("Unknown arch %s" % arch) |
| return False |
| return True |
| |
| |
| def GetBuildRoot(mode, arch, sanitizer): |
| return utils.GetBuildRoot(HOST_OS, mode, arch, sanitizer) |
| |
| |
| def GetDart(mode, arch, sanitizer): |
| executable = [abspath(join(GetBuildRoot(mode, arch, sanitizer), 'dart'))] |
| return executable |
| |
| |
| def Main(): |
| # Parse the options. |
| parser = BuildOptions() |
| (options, args) = parser.parse_args() |
| if not ProcessOptions(options): |
| parser.print_help() |
| return 1 |
| |
| chosen_benchmarks = ReadBenchmarkList(options.mode, 'BENCHMARKS', |
| options.core) |
| |
| # Use arguments to filter the benchmarks. |
| if len(args) > 0: |
| filt = [re.compile(x.lower()) for x in args] |
| chosen_benchmarks = [b for b in chosen_benchmarks if match(b[0], filt)] |
| |
| for mode in options.mode: |
| for arch in options.arch: |
| if options.executable is None: |
| # Construct the path to the dart binary. |
| executable = GetDart(mode, arch) |
| else: |
| executable = [options.executable] |
| for benchmark, vmargs, progargs in chosen_benchmarks: |
| command = executable |
| command = command + [ |
| GetBenchmarkFile([benchmark, 'dart', benchmark + '.dart']), |
| ] |
| if options.verbose: |
| print(' '.join(command)) |
| subprocess.call(command) |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(Main()) |