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 |