blob: b3283758700e87ccc13d1dd7b7635cffec2904be [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')
33D8_JAR = os.path.join(utils.REPO_ROOT, 'build', 'libs', 'd8.jar')
Tamas Kenez391fca82017-06-29 18:16:01 +020034GOYT_EXE = os.path.join('third_party', 'goyt',
35 'goyt_160525751')
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020036FRAMEWORK_JAR = os.path.join('third_party', 'framework',
37 'framework_160115954.jar')
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020038MIN_SDK_VERSION = '24'
39
40def parse_arguments():
41 parser = argparse.ArgumentParser(
Tamas Kenez391fca82017-06-29 18:16:01 +020042 description = 'Run D8, DX or Goyt on'
43 ' third_party/framework/framework*.jar.'
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020044 ' Report Golem-compatible CodeSize and RunTimeRaw values.')
45 parser.add_argument('--tool',
Tamas Kenez391fca82017-06-29 18:16:01 +020046 choices = ['dx', 'd8', 'd8-release', 'goyt'],
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020047 required = True,
48 help = 'Compiler tool to use.')
49 parser.add_argument('--name',
50 required = True,
51 help = 'Results will be printed using the specified benchmark name (e.g.'
Tamas Kenez8796a772017-06-28 12:44:44 +020052 ' <NAME>-<segment>(CodeSize): <bytes>)')
Tamas Kenezfc34cd82017-07-13 12:43:57 +020053 parser.add_argument('--print-memoryuse',
54 help = 'Prints the line \'<NAME>(MemoryUse):' +
55 ' <mem>\' at the end where <mem> is the peak' +
56 ' peak resident set size (VmHWM) in bytes.',
57 default = False,
58 action = 'store_true')
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020059 return parser.parse_args()
60
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020061def Main():
Tamas Kenez2cf47cf2017-07-25 10:22:52 +020062 utils.check_java_version()
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020063 args = parse_arguments()
64
65 with utils.TempDir() as temp_dir:
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020066
Tamas Kenez391fca82017-06-29 18:16:01 +020067 if args.tool in ['dx', 'goyt']:
68 tool_args = ['--dex', '--output=' + temp_dir, '--multi-dex',
69 '--min-sdk-version=' + MIN_SDK_VERSION]
70
71 if args.tool == 'goyt':
72 tool_file = GOYT_EXE
Tamas Kenez39b68ea2017-07-03 14:32:37 +020073 tool_args = ['--num-threads=4'] + tool_args
Tamas Kenez391fca82017-06-29 18:16:01 +020074 elif args.tool == 'dx':
75 tool_file = DX_JAR
76 else:
77 tool_file = D8_JAR
Ian Zerny877c1862017-07-06 11:12:26 +020078 tool_args = ['--output', temp_dir, '--min-api', MIN_SDK_VERSION]
Tamas Kenez391fca82017-06-29 18:16:01 +020079 if args.tool == 'd8-release':
80 tool_args.append('--release')
81
Tamas Kenezfc34cd82017-07-13 12:43:57 +020082
83 cmd = []
84
85 track_memory_file = None
86 if args.print_memoryuse:
87 track_memory_file = os.path.join(temp_dir, utils.MEMORY_USE_TMP_FILE)
88 cmd.extend(['tools/track_memory.sh', track_memory_file])
89
Tamas Kenez391fca82017-06-29 18:16:01 +020090 if tool_file.endswith('.jar'):
Tamas Kenezfc34cd82017-07-13 12:43:57 +020091 cmd.extend(['java', '-jar'])
Tamas Kenez391fca82017-06-29 18:16:01 +020092
93 cmd.extend([tool_file] + tool_args + [FRAMEWORK_JAR])
Tamas Kenez5cf51bb2017-06-27 15:40:46 +020094
95 utils.PrintCmd(cmd)
96
97 t0 = time.time()
98 subprocess.check_call(cmd)
99 dt = time.time() - t0
100
Tamas Kenezfc34cd82017-07-13 12:43:57 +0200101 if args.print_memoryuse:
102 print('{}(MemoryUse): {}'
103 .format(args.name, utils.grep_memoryuse(track_memory_file)))
104
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200105 dex_files = [f for f in glob(os.path.join(temp_dir, '*.dex'))]
106 code_size = 0
107 for dex_file in dex_files:
108 code_size += os.path.getsize(dex_file)
109
Tamas Kenez8796a772017-06-28 12:44:44 +0200110 print('{}-Total(RunTimeRaw): {} ms'
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200111 .format(args.name, 1000.0 * dt))
112
Tamas Kenez8796a772017-06-28 12:44:44 +0200113 print('{}-Total(CodeSize): {}'
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200114 .format(args.name, code_size))
115
Tamas Kenez02bff032017-07-18 12:13:58 +0200116 utils.print_dexsegments(args.name, dex_files)
Tamas Kenez5cf51bb2017-06-27 15:40:46 +0200117
118if __name__ == '__main__':
119 sys.exit(Main())