| #!/usr/bin/env python |
| # Copyright (c) 2017, the R8 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. |
| |
| # Run D8 or DX on 'third_party/framework/framework_<version>.jar'. |
| # Report Golem-compatible CodeSize and RunTimeRaw values: |
| # |
| # <NAME>-Total(CodeSize): <size> |
| # <NAME>-Total(RunTimeRaw>: <time> ms |
| # |
| # and also detailed segment sizes for each dex segment: |
| # |
| # <NAME>-Code(CodeSize): <size> |
| # <NAME>-AnnotationSets(CodeSize): <size> |
| # ... |
| # |
| # Uses the DexSegment Java tool (Gradle target). |
| |
| from __future__ import print_function |
| from glob import glob |
| import argparse |
| import golem |
| import os |
| import re |
| import subprocess |
| import sys |
| import time |
| |
| import utils |
| |
| DX_JAR = os.path.join(utils.REPO_ROOT, 'tools', 'linux', 'dx', 'framework', |
| 'dx.jar') |
| FRAMEWORK_JAR = os.path.join('third_party', 'framework', |
| 'framework_14082017_desugared.jar') |
| MIN_SDK_VERSION = '24' |
| |
| def parse_arguments(): |
| parser = argparse.ArgumentParser( |
| description = 'Run D8 or DX' |
| ' third_party/framework/framework*.jar.' |
| ' Report Golem-compatible CodeSize and RunTimeRaw values.') |
| parser.add_argument('--tool', |
| choices = ['dx', 'd8', 'd8-release'], |
| required = True, |
| help = 'Compiler tool to use.') |
| parser.add_argument('--golem', |
| help = 'Running on golem, link in third_party resources.', |
| default = False, |
| action = 'store_true') |
| parser.add_argument('--name', |
| required = True, |
| help = 'Results will be printed using the specified benchmark name (e.g.' |
| ' <NAME>-<segment>(CodeSize): <bytes>), the full size is reported' |
| ' with <NAME>-Total(CodeSize)') |
| parser.add_argument('--print-memoryuse', |
| help = 'Prints the line \'<NAME>-Total(MemoryUse):' + |
| ' <mem>\' at the end where <mem> is the peak' + |
| ' peak resident set size (VmHWM) in bytes.', |
| default = False, |
| action = 'store_true') |
| parser.add_argument('--output', |
| help = 'Output directory to keep the generated files') |
| return parser.parse_args() |
| |
| def Main(): |
| utils.check_java_version() |
| args = parse_arguments() |
| output_dir = args.output |
| if args.golem: |
| golem.link_third_party() |
| with utils.TempDir() as temp_dir: |
| |
| if not output_dir: |
| output_dir = temp_dir |
| |
| xmx = None |
| if args.tool == 'dx': |
| tool_file = DX_JAR |
| tool_args = ['--dex', '--output=' + output_dir, '--multi-dex', |
| '--min-sdk-version=' + MIN_SDK_VERSION] |
| xmx = '-Xmx1600m' |
| else: |
| tool_file = utils.D8_JAR |
| tool_args = ['--output', output_dir, '--min-api', MIN_SDK_VERSION] |
| if args.tool == 'd8-release': |
| tool_args.append('--release') |
| xmx = '-Xmx600m' |
| |
| cmd = [] |
| |
| track_memory_file = None |
| if args.print_memoryuse: |
| track_memory_file = os.path.join(output_dir, utils.MEMORY_USE_TMP_FILE) |
| cmd.extend(['tools/track_memory.sh', track_memory_file]) |
| |
| if tool_file.endswith('.jar'): |
| assert xmx is not None |
| cmd.extend(['java', xmx, '-jar']) |
| |
| cmd.extend([tool_file] + tool_args + [FRAMEWORK_JAR]) |
| |
| utils.PrintCmd(cmd) |
| |
| t0 = time.time() |
| subprocess.check_call(cmd) |
| dt = time.time() - t0 |
| |
| if args.print_memoryuse: |
| print('{}-Total(MemoryUse): {}' |
| .format(args.name, utils.grep_memoryuse(track_memory_file))) |
| |
| dex_files = [f for f in glob(os.path.join(output_dir, '*.dex'))] |
| code_size = 0 |
| for dex_file in dex_files: |
| code_size += os.path.getsize(dex_file) |
| |
| print('{}-Total(RunTimeRaw): {} ms' |
| .format(args.name, 1000.0 * dt)) |
| |
| print('{}-Total(CodeSize): {}' |
| .format(args.name, code_size)) |
| |
| utils.print_dexsegments(args.name, dex_files) |
| |
| if __name__ == '__main__': |
| sys.exit(Main()) |