| Index: mojo/devtools/common/mojo_benchmark
|
| diff --git a/mojo/devtools/common/mojo_benchmark b/mojo/devtools/common/mojo_benchmark
|
| index 6ade1b14f17a7ba7b4fbe45b3a7ee743c43a2acd..b6c17aeb2eaad32722256726c3044f9c2522df99 100755
|
| --- a/mojo/devtools/common/mojo_benchmark
|
| +++ b/mojo/devtools/common/mojo_benchmark
|
| @@ -7,14 +7,13 @@
|
|
|
| import argparse
|
| import logging
|
| -import os.path
|
| -import re
|
| import sys
|
| import time
|
|
|
| +from devtoolslib import benchmark
|
| +from devtoolslib import perf_dashboard
|
| from devtoolslib import shell_arguments
|
| from devtoolslib import shell_config
|
| -from devtoolslib import perf_dashboard
|
|
|
|
|
| _DESCRIPTION = """Runner for Mojo application benchmarks.
|
| @@ -26,7 +25,6 @@ https://github.com/domokit/devtools/blob/master/docs/mojo_benchmark.md .
|
|
|
| _logger = logging.getLogger()
|
|
|
| -_BENCHMARK_APP = 'https://core.mojoapps.io/benchmark.mojo'
|
| _CACHE_SERVICE_URL = 'mojo:url_response_disk_cache'
|
| _NETWORK_SERVICE_URL = 'mojo:network_service'
|
|
|
| @@ -35,21 +33,6 @@ _COLD_START_SHELL_ARGS = [
|
| '--args-for=%s %s' % (_NETWORK_SERVICE_URL, '--clear'),
|
| ]
|
|
|
| -# Additional time in seconds allocated per shell run to accommodate start-up.
|
| -# The shell should terminate before hitting this time out, it is an error if it
|
| -# doesn't.
|
| -_EXTRA_TIMEOUT = 20
|
| -
|
| -_MEASUREMENT_RESULT_FORMAT = r"""
|
| -^ # Beginning of the line.
|
| -measurement: # Hard-coded tag.
|
| -\s+(\S+) # Match measurement spec.
|
| -\s+(\S+) # Match measurement result.
|
| -$ # End of the line.
|
| -"""
|
| -
|
| -_MEASUREMENT_REGEX = re.compile(_MEASUREMENT_RESULT_FORMAT, re.VERBOSE)
|
| -
|
|
|
| def _generate_benchmark_variants(benchmark_spec):
|
| """Generates benchmark specifications for individual variants of the given
|
| @@ -76,72 +59,6 @@ def _generate_benchmark_variants(benchmark_spec):
|
| return variants
|
|
|
|
|
| -def _run_benchmark(shell, shell_args, app, duration_seconds, measurements,
|
| - verbose, android, output_file):
|
| - """Runs the given benchmark by running `benchmark.mojo` in mojo shell with
|
| - appropriate arguments and returns the produced output.
|
| -
|
| - Returns:
|
| - A tuple of (succeeded, error_msg, output).
|
| - """
|
| - timeout = duration_seconds + _EXTRA_TIMEOUT
|
| - benchmark_args = []
|
| - benchmark_args.append('--app=' + app)
|
| - benchmark_args.append('--duration=' + str(duration_seconds))
|
| -
|
| - device_output_file = None
|
| - if output_file:
|
| - if android:
|
| - device_output_file = os.path.join(shell.get_tmp_dir_path(), output_file)
|
| - benchmark_args.append('--trace-output=' + device_output_file)
|
| - else:
|
| - benchmark_args.append('--trace-output=' + output_file)
|
| -
|
| - for measurement in measurements:
|
| - benchmark_args.append(measurement['spec'])
|
| -
|
| - shell_args = list(shell_args)
|
| - shell_args.append(_BENCHMARK_APP)
|
| - shell_args.append('--force-offline-by-default')
|
| - shell_args.append('--args-for=%s %s' % (_BENCHMARK_APP,
|
| - ' '.join(benchmark_args)))
|
| -
|
| - if verbose:
|
| - print 'shell arguments: ' + str(shell_args)
|
| - return_code, output, did_time_out = shell.run_and_get_output(
|
| - shell_args, timeout=timeout)
|
| -
|
| - if did_time_out:
|
| - return False, 'timed out', output
|
| - if return_code:
|
| - return False, 'return code: ' + str(return_code), output
|
| -
|
| - # Pull the trace file even if some measurements are missing, as it can be
|
| - # useful in debugging.
|
| - if device_output_file:
|
| - shell.pull_file(device_output_file, output_file, remove_original=True)
|
| -
|
| - return True, None, output
|
| -
|
| -
|
| -def _parse_measurement_results(output):
|
| - """Parses the measurement results present in the benchmark output and returns
|
| - the dictionary of correctly recognized and parsed results.
|
| - """
|
| - measurement_results = {}
|
| - output_lines = [line.strip() for line in output.split('\n')]
|
| - for line in output_lines:
|
| - match = re.match(_MEASUREMENT_REGEX, line)
|
| - if match:
|
| - measurement_spec = match.group(1)
|
| - measurement_result = match.group(2)
|
| - try:
|
| - measurement_results[measurement_spec] = float(measurement_result)
|
| - except ValueError:
|
| - pass
|
| - return measurement_results
|
| -
|
| -
|
| def main():
|
| parser = argparse.ArgumentParser(
|
| formatter_class=argparse.RawDescriptionHelpFormatter,
|
| @@ -190,7 +107,7 @@ def main():
|
| chart_data_recorder = perf_dashboard.ChartDataRecorder(
|
| script_args.test_name)
|
|
|
| - benchmark_succeeded, benchmark_error, output = _run_benchmark(
|
| + results = benchmark.run(
|
| shell, shell_args, app, duration, measurements, script_args.verbose,
|
| script_args.android, output_file)
|
|
|
| @@ -198,13 +115,12 @@ def main():
|
|
|
| some_measurements_failed = False
|
| some_measurements_succeeded = False
|
| - if benchmark_succeeded:
|
| - measurement_results = _parse_measurement_results(output)
|
| + if results.succeeded:
|
| # Iterate over the list of specs, not the dictionary, to detect missing
|
| # results and preserve the required order.
|
| for measurement in measurements:
|
| - if measurement['spec'] in measurement_results:
|
| - result = measurement_results[measurement['spec']]
|
| + if measurement['spec'] in results.measurements:
|
| + result = results.measurements[measurement['spec']]
|
| print '%10.4f %s' % (result, measurement['name'])
|
|
|
| if chart_data_recorder:
|
| @@ -218,14 +134,14 @@ def main():
|
| print '? %s' % measurement['name']
|
| some_measurements_failed = True
|
|
|
| - if not benchmark_succeeded or some_measurements_failed:
|
| - if not benchmark_succeeded:
|
| - print 'benchmark failed: ' + benchmark_error
|
| + if not results.succeeded or some_measurements_failed:
|
| + if not results.succeeded:
|
| + print 'benchmark failed: ' + results.error_str
|
| if some_measurements_failed:
|
| print 'some measurements failed'
|
| print 'output: '
|
| print '-' * 72
|
| - print output
|
| + print results.output
|
| print '-' * 72
|
| exit_code = 1
|
|
|
|
|