blob: 99e0719ebd1caebfb20193974573a2c10f08f42f [file] [log] [blame]
Tamas Kenez5cf51bb2017-06-27 15:40:46 +02001#!/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 Wind11c74c22018-08-31 08:11:42 +02006# Run D8 or DX on 'third_party/framework/framework_<version>.jar'.
Tamas Kenez5cf51bb2017-06-27 15:40:46 +02007# Report Golem-compatible CodeSize and RunTimeRaw values:
8#
Tamas Kenez8796a772017-06-28 12:44:44 +02009# <NAME>-Total(CodeSize): <size>
10# <NAME>-Total(RunTimeRaw>: <time> ms
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020011#
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
20from __future__ import print_function
21from glob import glob
22import argparse
Rico Wind1f4172c2018-09-06 16:29:03 +020023import golem
Ian Zerny3f54e222019-02-12 10:51:17 +010024import jdk
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020025import os
26import re
27import subprocess
28import sys
29import time
30
31import utils
32
33DX_JAR = os.path.join(utils.REPO_ROOT, 'tools', 'linux', 'dx', 'framework',
34 'dx.jar')
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020035FRAMEWORK_JAR = os.path.join('third_party', 'framework',
Rico Wind3a30c8f2017-08-16 09:13:35 +020036 'framework_14082017_desugared.jar')
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020037MIN_SDK_VERSION = '24'
38
39def parse_arguments():
40 parser = argparse.ArgumentParser(
Rico Wind11c74c22018-08-31 08:11:42 +020041 description = 'Run D8 or DX'
Tamas Kenez391fca82017-06-29 18:16:01 +020042 ' third_party/framework/framework*.jar.'
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020043 ' Report Golem-compatible CodeSize and RunTimeRaw values.')
44 parser.add_argument('--tool',
Rico Wind11c74c22018-08-31 08:11:42 +020045 choices = ['dx', 'd8', 'd8-release'],
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020046 required = True,
47 help = 'Compiler tool to use.')
Rico Wind1f4172c2018-09-06 16:29:03 +020048 parser.add_argument('--golem',
49 help = 'Running on golem, link in third_party resources.',
50 default = False,
51 action = 'store_true')
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020052 parser.add_argument('--name',
53 required = True,
54 help = 'Results will be printed using the specified benchmark name (e.g.'
Tamas Kenez13f68cf2017-08-10 13:19:41 +020055 ' <NAME>-<segment>(CodeSize): <bytes>), the full size is reported'
56 ' with <NAME>-Total(CodeSize)')
Tamas Kenezfc34cd82017-07-13 12:43:57 +020057 parser.add_argument('--print-memoryuse',
Morten Krogh-Jespersen38c7ca02019-02-04 10:39:57 +010058 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 Kenezfc34cd82017-07-13 12:43:57 +020061 default = False,
62 action = 'store_true')
Søren Gjesseef3503b2017-08-25 09:20:40 +020063 parser.add_argument('--output',
Morten Krogh-Jespersen38c7ca02019-02-04 10:39:57 +010064 help = 'Output directory to keep the generated files')
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020065 return parser.parse_args()
66
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020067def Main():
68 args = parse_arguments()
Rico Wind1f4172c2018-09-06 16:29:03 +020069 if args.golem:
70 golem.link_third_party()
Ian Zerny09e8a462019-03-26 08:59:32 +010071 utils.check_java_version()
72 output_dir = args.output
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020073 with utils.TempDir() as temp_dir:
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020074
Søren Gjesseef3503b2017-08-25 09:20:40 +020075 if not output_dir:
76 output_dir = temp_dir
77
Tamas Kenezca3f2822017-08-16 16:06:01 +020078 xmx = None
Rico Wind11c74c22018-08-31 08:11:42 +020079 if args.tool == 'dx':
Tamas Kenez391fca82017-06-29 18:16:01 +020080 tool_file = DX_JAR
Rico Wind11c74c22018-08-31 08:11:42 +020081 tool_args = ['--dex', '--output=' + output_dir, '--multi-dex',
82 '--min-sdk-version=' + MIN_SDK_VERSION]
Tamas Kenezca3f2822017-08-16 16:06:01 +020083 xmx = '-Xmx1600m'
Tamas Kenez391fca82017-06-29 18:16:01 +020084 else:
Rico Windb4621c12017-08-28 12:48:53 +020085 tool_file = utils.D8_JAR
Søren Gjesseef3503b2017-08-25 09:20:40 +020086 tool_args = ['--output', output_dir, '--min-api', MIN_SDK_VERSION]
Tamas Kenez391fca82017-06-29 18:16:01 +020087 if args.tool == 'd8-release':
88 tool_args.append('--release')
Tamas Kenezca3f2822017-08-16 16:06:01 +020089 xmx = '-Xmx600m'
Tamas Kenezfc34cd82017-07-13 12:43:57 +020090
91 cmd = []
92
93 track_memory_file = None
94 if args.print_memoryuse:
Søren Gjesseef3503b2017-08-25 09:20:40 +020095 track_memory_file = os.path.join(output_dir, utils.MEMORY_USE_TMP_FILE)
Tamas Kenezfc34cd82017-07-13 12:43:57 +020096 cmd.extend(['tools/track_memory.sh', track_memory_file])
97
Tamas Kenez391fca82017-06-29 18:16:01 +020098 if tool_file.endswith('.jar'):
Tamas Kenezca3f2822017-08-16 16:06:01 +020099 assert xmx is not None
Ian Zerny3f54e222019-02-12 10:51:17 +0100100 cmd.extend([jdk.GetJavaExecutable(), xmx, '-jar'])
Tamas Kenez391fca82017-06-29 18:16:01 +0200101
102 cmd.extend([tool_file] + tool_args + [FRAMEWORK_JAR])
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200103
104 utils.PrintCmd(cmd)
105
106 t0 = time.time()
107 subprocess.check_call(cmd)
108 dt = time.time() - t0
109
Tamas Kenezfc34cd82017-07-13 12:43:57 +0200110 if args.print_memoryuse:
Tamas Kenez13f68cf2017-08-10 13:19:41 +0200111 print('{}-Total(MemoryUse): {}'
Tamas Kenezfc34cd82017-07-13 12:43:57 +0200112 .format(args.name, utils.grep_memoryuse(track_memory_file)))
113
Søren Gjesseef3503b2017-08-25 09:20:40 +0200114 dex_files = [f for f in glob(os.path.join(output_dir, '*.dex'))]
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200115 code_size = 0
116 for dex_file in dex_files:
117 code_size += os.path.getsize(dex_file)
118
Tamas Kenez8796a772017-06-28 12:44:44 +0200119 print('{}-Total(RunTimeRaw): {} ms'
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200120 .format(args.name, 1000.0 * dt))
121
Tamas Kenez8796a772017-06-28 12:44:44 +0200122 print('{}-Total(CodeSize): {}'
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200123 .format(args.name, code_size))
124
Tamas Kenez02bff032017-07-18 12:13:58 +0200125 utils.print_dexsegments(args.name, dex_files)
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200126
127if __name__ == '__main__':
128 sys.exit(Main())