Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | # Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file |
| 3 | # for details. All rights reserved. Use of this source code is governed by a |
| 4 | # BSD-style license that can be found in the LICENSE file. |
| 5 | |
Rico Wind | 11c74c2 | 2018-08-31 08:11:42 +0200 | [diff] [blame] | 6 | # Run D8 or DX on 'third_party/framework/framework_<version>.jar'. |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 7 | # Report Golem-compatible CodeSize and RunTimeRaw values: |
| 8 | # |
Tamas Kenez | 8796a77 | 2017-06-28 12:44:44 +0200 | [diff] [blame] | 9 | # <NAME>-Total(CodeSize): <size> |
| 10 | # <NAME>-Total(RunTimeRaw>: <time> ms |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 11 | # |
| 12 | # and also detailed segment sizes for each dex segment: |
| 13 | # |
| 14 | # <NAME>-Code(CodeSize): <size> |
| 15 | # <NAME>-AnnotationSets(CodeSize): <size> |
| 16 | # ... |
| 17 | # |
| 18 | # Uses the DexSegment Java tool (Gradle target). |
| 19 | |
| 20 | from __future__ import print_function |
| 21 | from glob import glob |
| 22 | import argparse |
Rico Wind | 1f4172c | 2018-09-06 16:29:03 +0200 | [diff] [blame] | 23 | import golem |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 24 | import os |
| 25 | import re |
| 26 | import subprocess |
| 27 | import sys |
| 28 | import time |
| 29 | |
| 30 | import utils |
| 31 | |
| 32 | DX_JAR = os.path.join(utils.REPO_ROOT, 'tools', 'linux', 'dx', 'framework', |
| 33 | 'dx.jar') |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 34 | FRAMEWORK_JAR = os.path.join('third_party', 'framework', |
Rico Wind | 3a30c8f | 2017-08-16 09:13:35 +0200 | [diff] [blame] | 35 | 'framework_14082017_desugared.jar') |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 36 | MIN_SDK_VERSION = '24' |
| 37 | |
| 38 | def parse_arguments(): |
| 39 | parser = argparse.ArgumentParser( |
Rico Wind | 11c74c2 | 2018-08-31 08:11:42 +0200 | [diff] [blame] | 40 | description = 'Run D8 or DX' |
Tamas Kenez | 391fca8 | 2017-06-29 18:16:01 +0200 | [diff] [blame] | 41 | ' third_party/framework/framework*.jar.' |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 42 | ' Report Golem-compatible CodeSize and RunTimeRaw values.') |
| 43 | parser.add_argument('--tool', |
Rico Wind | 11c74c2 | 2018-08-31 08:11:42 +0200 | [diff] [blame] | 44 | choices = ['dx', 'd8', 'd8-release'], |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 45 | required = True, |
| 46 | help = 'Compiler tool to use.') |
Rico Wind | 1f4172c | 2018-09-06 16:29:03 +0200 | [diff] [blame] | 47 | parser.add_argument('--golem', |
| 48 | help = 'Running on golem, link in third_party resources.', |
| 49 | default = False, |
| 50 | action = 'store_true') |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 51 | parser.add_argument('--name', |
| 52 | required = True, |
| 53 | help = 'Results will be printed using the specified benchmark name (e.g.' |
Tamas Kenez | 13f68cf | 2017-08-10 13:19:41 +0200 | [diff] [blame] | 54 | ' <NAME>-<segment>(CodeSize): <bytes>), the full size is reported' |
| 55 | ' with <NAME>-Total(CodeSize)') |
Tamas Kenez | fc34cd8 | 2017-07-13 12:43:57 +0200 | [diff] [blame] | 56 | parser.add_argument('--print-memoryuse', |
Morten Krogh-Jespersen | 38c7ca0 | 2019-02-04 10:39:57 +0100 | [diff] [blame] | 57 | help = 'Prints the line \'<NAME>-Total(MemoryUse):' |
| 58 | ' <mem>\' at the end where <mem> is the peak' |
| 59 | ' peak resident set size (VmHWM) in bytes.', |
Tamas Kenez | fc34cd8 | 2017-07-13 12:43:57 +0200 | [diff] [blame] | 60 | default = False, |
| 61 | action = 'store_true') |
Søren Gjesse | ef3503b | 2017-08-25 09:20:40 +0200 | [diff] [blame] | 62 | parser.add_argument('--output', |
Morten Krogh-Jespersen | 38c7ca0 | 2019-02-04 10:39:57 +0100 | [diff] [blame] | 63 | help = 'Output directory to keep the generated files') |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 64 | return parser.parse_args() |
| 65 | |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 66 | def Main(): |
Tamas Kenez | 2cf47cf | 2017-07-25 10:22:52 +0200 | [diff] [blame] | 67 | utils.check_java_version() |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 68 | args = parse_arguments() |
Søren Gjesse | ef3503b | 2017-08-25 09:20:40 +0200 | [diff] [blame] | 69 | output_dir = args.output |
Rico Wind | 1f4172c | 2018-09-06 16:29:03 +0200 | [diff] [blame] | 70 | if args.golem: |
| 71 | golem.link_third_party() |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 72 | with utils.TempDir() as temp_dir: |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 73 | |
Søren Gjesse | ef3503b | 2017-08-25 09:20:40 +0200 | [diff] [blame] | 74 | if not output_dir: |
| 75 | output_dir = temp_dir |
| 76 | |
Tamas Kenez | ca3f282 | 2017-08-16 16:06:01 +0200 | [diff] [blame] | 77 | xmx = None |
Rico Wind | 11c74c2 | 2018-08-31 08:11:42 +0200 | [diff] [blame] | 78 | if args.tool == 'dx': |
Tamas Kenez | 391fca8 | 2017-06-29 18:16:01 +0200 | [diff] [blame] | 79 | tool_file = DX_JAR |
Rico Wind | 11c74c2 | 2018-08-31 08:11:42 +0200 | [diff] [blame] | 80 | tool_args = ['--dex', '--output=' + output_dir, '--multi-dex', |
| 81 | '--min-sdk-version=' + MIN_SDK_VERSION] |
Tamas Kenez | ca3f282 | 2017-08-16 16:06:01 +0200 | [diff] [blame] | 82 | xmx = '-Xmx1600m' |
Tamas Kenez | 391fca8 | 2017-06-29 18:16:01 +0200 | [diff] [blame] | 83 | else: |
Rico Wind | b4621c1 | 2017-08-28 12:48:53 +0200 | [diff] [blame] | 84 | tool_file = utils.D8_JAR |
Søren Gjesse | ef3503b | 2017-08-25 09:20:40 +0200 | [diff] [blame] | 85 | tool_args = ['--output', output_dir, '--min-api', MIN_SDK_VERSION] |
Tamas Kenez | 391fca8 | 2017-06-29 18:16:01 +0200 | [diff] [blame] | 86 | if args.tool == 'd8-release': |
| 87 | tool_args.append('--release') |
Tamas Kenez | ca3f282 | 2017-08-16 16:06:01 +0200 | [diff] [blame] | 88 | xmx = '-Xmx600m' |
Tamas Kenez | fc34cd8 | 2017-07-13 12:43:57 +0200 | [diff] [blame] | 89 | |
| 90 | cmd = [] |
| 91 | |
| 92 | track_memory_file = None |
| 93 | if args.print_memoryuse: |
Søren Gjesse | ef3503b | 2017-08-25 09:20:40 +0200 | [diff] [blame] | 94 | track_memory_file = os.path.join(output_dir, utils.MEMORY_USE_TMP_FILE) |
Tamas Kenez | fc34cd8 | 2017-07-13 12:43:57 +0200 | [diff] [blame] | 95 | cmd.extend(['tools/track_memory.sh', track_memory_file]) |
| 96 | |
Tamas Kenez | 391fca8 | 2017-06-29 18:16:01 +0200 | [diff] [blame] | 97 | if tool_file.endswith('.jar'): |
Tamas Kenez | ca3f282 | 2017-08-16 16:06:01 +0200 | [diff] [blame] | 98 | assert xmx is not None |
| 99 | cmd.extend(['java', xmx, '-jar']) |
Tamas Kenez | 391fca8 | 2017-06-29 18:16:01 +0200 | [diff] [blame] | 100 | |
| 101 | cmd.extend([tool_file] + tool_args + [FRAMEWORK_JAR]) |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 102 | |
| 103 | utils.PrintCmd(cmd) |
| 104 | |
| 105 | t0 = time.time() |
| 106 | subprocess.check_call(cmd) |
| 107 | dt = time.time() - t0 |
| 108 | |
Tamas Kenez | fc34cd8 | 2017-07-13 12:43:57 +0200 | [diff] [blame] | 109 | if args.print_memoryuse: |
Tamas Kenez | 13f68cf | 2017-08-10 13:19:41 +0200 | [diff] [blame] | 110 | print('{}-Total(MemoryUse): {}' |
Tamas Kenez | fc34cd8 | 2017-07-13 12:43:57 +0200 | [diff] [blame] | 111 | .format(args.name, utils.grep_memoryuse(track_memory_file))) |
| 112 | |
Søren Gjesse | ef3503b | 2017-08-25 09:20:40 +0200 | [diff] [blame] | 113 | dex_files = [f for f in glob(os.path.join(output_dir, '*.dex'))] |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 114 | code_size = 0 |
| 115 | for dex_file in dex_files: |
| 116 | code_size += os.path.getsize(dex_file) |
| 117 | |
Tamas Kenez | 8796a77 | 2017-06-28 12:44:44 +0200 | [diff] [blame] | 118 | print('{}-Total(RunTimeRaw): {} ms' |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 119 | .format(args.name, 1000.0 * dt)) |
| 120 | |
Tamas Kenez | 8796a77 | 2017-06-28 12:44:44 +0200 | [diff] [blame] | 121 | print('{}-Total(CodeSize): {}' |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 122 | .format(args.name, code_size)) |
| 123 | |
Tamas Kenez | 02bff03 | 2017-07-18 12:13:58 +0200 | [diff] [blame] | 124 | utils.print_dexsegments(args.name, dex_files) |
Tamas Kenez | 5cf51bb | 2017-06-27 15:40:46 +0200 | [diff] [blame] | 125 | |
| 126 | if __name__ == '__main__': |
| 127 | sys.exit(Main()) |