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