#!/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())