dart-sdk/runtime/tools/benchmark.py
Alexander Thomas b5c63ce757 [infra] Migrate scripts to python3
* Migrate to python3; drop python support.
* Update Windows toolchain support.
* Remove some unused methods.
* Python 2.7 is still needed on Windows.
* Update gsutil to a version that supports python3.

Fixes: https://github.com/dart-lang/sdk/issues/28793

TEST=Manually tested common user journeys.

Change-Id: I663a22b237a548bb82dc2e601e399e3bc3649211
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/192182
Reviewed-by: William Hesse <whesse@google.com>
Reviewed-by: Alexander Aprelev <aam@google.com>
2021-04-15 10:10:20 +00:00

148 lines
4.2 KiB
Python
Executable file

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