blob: 9ef1113962aa901f8fc657f13378348cb07e195d [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
Tamas Kenez391fca82017-06-29 18:16:01 +02006# Run D8, DX or Goyt 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
23import os
24import re
25import subprocess
26import sys
27import time
28
29import utils
30
31DX_JAR = os.path.join(utils.REPO_ROOT, 'tools', 'linux', 'dx', 'framework',
32 'dx.jar')
Tamas Kenez391fca82017-06-29 18:16:01 +020033GOYT_EXE = os.path.join('third_party', 'goyt',
Tamas Kenezfaae4412017-09-27 17:10:42 +020034 'goyt_170197324')
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(
Tamas Kenez391fca82017-06-29 18:16:01 +020041 description = 'Run D8, DX or Goyt on'
42 ' 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 Wind7e0b4c72017-08-16 09:30:56 +020045 choices = ['dx', 'd8', 'd8-release', 'goyt', 'goyt-release'],
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020046 required = True,
47 help = 'Compiler tool to use.')
48 parser.add_argument('--name',
49 required = True,
50 help = 'Results will be printed using the specified benchmark name (e.g.'
Tamas Kenez13f68cf2017-08-10 13:19:41 +020051 ' <NAME>-<segment>(CodeSize): <bytes>), the full size is reported'
52 ' with <NAME>-Total(CodeSize)')
Tamas Kenezfc34cd82017-07-13 12:43:57 +020053 parser.add_argument('--print-memoryuse',
Tamas Kenez13f68cf2017-08-10 13:19:41 +020054 help = 'Prints the line \'<NAME>-Total(MemoryUse):' +
Tamas Kenezfc34cd82017-07-13 12:43:57 +020055 ' <mem>\' at the end where <mem> is the peak' +
56 ' peak resident set size (VmHWM) in bytes.',
57 default = False,
58 action = 'store_true')
Søren Gjesseef3503b2017-08-25 09:20:40 +020059 parser.add_argument('--output',
60 help = 'Output directory to keep the generated files')
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020061 return parser.parse_args()
62
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020063def Main():
Tamas Kenez2cf47cf2017-07-25 10:22:52 +020064 utils.check_java_version()
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020065 args = parse_arguments()
Søren Gjesseef3503b2017-08-25 09:20:40 +020066 output_dir = args.output
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020067
68 with utils.TempDir() as temp_dir:
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020069
Søren Gjesseef3503b2017-08-25 09:20:40 +020070 if not output_dir:
71 output_dir = temp_dir
72
Rico Wind7e0b4c72017-08-16 09:30:56 +020073 if args.tool in ['dx', 'goyt', 'goyt-release']:
Søren Gjesseef3503b2017-08-25 09:20:40 +020074 tool_args = ['--dex', '--output=' + output_dir, '--multi-dex',
Tamas Kenez391fca82017-06-29 18:16:01 +020075 '--min-sdk-version=' + MIN_SDK_VERSION]
76
Tamas Kenezca3f2822017-08-16 16:06:01 +020077 xmx = None
Rico Wind7e0b4c72017-08-16 09:30:56 +020078 if args.tool.startswith('goyt'):
Tamas Kenez391fca82017-06-29 18:16:01 +020079 tool_file = GOYT_EXE
Rico Windea18a7a2017-08-14 07:11:09 +020080 tool_args = ['--num-threads=8'] + tool_args
Rico Wind7e0b4c72017-08-16 09:30:56 +020081 if args.tool == 'goyt-release':
82 tool_args.append('--no-locals')
Tamas Kenezd1834992017-09-28 09:40:17 +020083 else:
84 tool_args.append('--no-optimize')
Tamas Kenez391fca82017-06-29 18:16:01 +020085 elif args.tool == 'dx':
86 tool_file = DX_JAR
Tamas Kenezca3f2822017-08-16 16:06:01 +020087 xmx = '-Xmx1600m'
Tamas Kenez391fca82017-06-29 18:16:01 +020088 else:
Rico Windb4621c12017-08-28 12:48:53 +020089 tool_file = utils.D8_JAR
Søren Gjesseef3503b2017-08-25 09:20:40 +020090 tool_args = ['--output', output_dir, '--min-api', MIN_SDK_VERSION]
Tamas Kenez391fca82017-06-29 18:16:01 +020091 if args.tool == 'd8-release':
92 tool_args.append('--release')
Tamas Kenezca3f2822017-08-16 16:06:01 +020093 xmx = '-Xmx600m'
Tamas Kenezfc34cd82017-07-13 12:43:57 +020094
95 cmd = []
96
97 track_memory_file = None
98 if args.print_memoryuse:
Søren Gjesseef3503b2017-08-25 09:20:40 +020099 track_memory_file = os.path.join(output_dir, utils.MEMORY_USE_TMP_FILE)
Tamas Kenezfc34cd82017-07-13 12:43:57 +0200100 cmd.extend(['tools/track_memory.sh', track_memory_file])
101
Tamas Kenez391fca82017-06-29 18:16:01 +0200102 if tool_file.endswith('.jar'):
Tamas Kenezca3f2822017-08-16 16:06:01 +0200103 assert xmx is not None
104 cmd.extend(['java', xmx, '-jar'])
Tamas Kenez391fca82017-06-29 18:16:01 +0200105
106 cmd.extend([tool_file] + tool_args + [FRAMEWORK_JAR])
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200107
108 utils.PrintCmd(cmd)
109
110 t0 = time.time()
111 subprocess.check_call(cmd)
112 dt = time.time() - t0
113
Tamas Kenezfc34cd82017-07-13 12:43:57 +0200114 if args.print_memoryuse:
Tamas Kenez13f68cf2017-08-10 13:19:41 +0200115 print('{}-Total(MemoryUse): {}'
Tamas Kenezfc34cd82017-07-13 12:43:57 +0200116 .format(args.name, utils.grep_memoryuse(track_memory_file)))
117
Søren Gjesseef3503b2017-08-25 09:20:40 +0200118 dex_files = [f for f in glob(os.path.join(output_dir, '*.dex'))]
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200119 code_size = 0
120 for dex_file in dex_files:
121 code_size += os.path.getsize(dex_file)
122
Tamas Kenez8796a772017-06-28 12:44:44 +0200123 print('{}-Total(RunTimeRaw): {} ms'
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200124 .format(args.name, 1000.0 * dt))
125
Tamas Kenez8796a772017-06-28 12:44:44 +0200126 print('{}-Total(CodeSize): {}'
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200127 .format(args.name, code_size))
128
Tamas Kenez02bff032017-07-18 12:13:58 +0200129 utils.print_dexsegments(args.name, dex_files)
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200130
131if __name__ == '__main__':
132 sys.exit(Main())