xref: /aosp_15_r20/external/protobuf/benchmarks/util/result_parser.py (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker# This import depends on the automake rule protoc_middleman, please make sure
2*1b3f573fSAndroid Build Coastguard Worker# protoc_middleman has been built before run this file.
3*1b3f573fSAndroid Build Coastguard Workerimport argparse
4*1b3f573fSAndroid Build Coastguard Workerimport json
5*1b3f573fSAndroid Build Coastguard Workerimport re
6*1b3f573fSAndroid Build Coastguard Workerimport os.path
7*1b3f573fSAndroid Build Coastguard Worker# BEGIN OPENSOURCE
8*1b3f573fSAndroid Build Coastguard Workerimport sys
9*1b3f573fSAndroid Build Coastguard Workersys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
10*1b3f573fSAndroid Build Coastguard Worker# END OPENSOURCE
11*1b3f573fSAndroid Build Coastguard Workerimport tmp.benchmarks_pb2 as benchmarks_pb2
12*1b3f573fSAndroid Build Coastguard Worker
13*1b3f573fSAndroid Build Coastguard Worker__file_size_map = {}
14*1b3f573fSAndroid Build Coastguard Worker
15*1b3f573fSAndroid Build Coastguard Workerdef __get_data_size(filename):
16*1b3f573fSAndroid Build Coastguard Worker  if filename[0] != '/':
17*1b3f573fSAndroid Build Coastguard Worker    filename = os.path.dirname(os.path.abspath(__file__)) + "/../" + filename
18*1b3f573fSAndroid Build Coastguard Worker  if filename in __file_size_map:
19*1b3f573fSAndroid Build Coastguard Worker    return __file_size_map[filename]
20*1b3f573fSAndroid Build Coastguard Worker  benchmark_dataset = benchmarks_pb2.BenchmarkDataset()
21*1b3f573fSAndroid Build Coastguard Worker  benchmark_dataset.ParseFromString(
22*1b3f573fSAndroid Build Coastguard Worker      open(filename, "rb").read())
23*1b3f573fSAndroid Build Coastguard Worker  size = 0
24*1b3f573fSAndroid Build Coastguard Worker  count = 0
25*1b3f573fSAndroid Build Coastguard Worker  for payload in benchmark_dataset.payload:
26*1b3f573fSAndroid Build Coastguard Worker    size += len(payload)
27*1b3f573fSAndroid Build Coastguard Worker    count += 1
28*1b3f573fSAndroid Build Coastguard Worker  __file_size_map[filename] = (size, 1.0 * size / count)
29*1b3f573fSAndroid Build Coastguard Worker  return size, 1.0 * size / count
30*1b3f573fSAndroid Build Coastguard Worker
31*1b3f573fSAndroid Build Coastguard Worker
32*1b3f573fSAndroid Build Coastguard Workerdef __extract_file_name(file_name):
33*1b3f573fSAndroid Build Coastguard Worker  name_list = re.split(r"[/\.]", file_name)
34*1b3f573fSAndroid Build Coastguard Worker  short_file_name = ""
35*1b3f573fSAndroid Build Coastguard Worker  for name in name_list:
36*1b3f573fSAndroid Build Coastguard Worker    if name[:14] == "google_message":
37*1b3f573fSAndroid Build Coastguard Worker      short_file_name = name
38*1b3f573fSAndroid Build Coastguard Worker  return short_file_name
39*1b3f573fSAndroid Build Coastguard Worker
40*1b3f573fSAndroid Build Coastguard Worker
41*1b3f573fSAndroid Build Coastguard Worker__results = []
42*1b3f573fSAndroid Build Coastguard Worker
43*1b3f573fSAndroid Build Coastguard Worker
44*1b3f573fSAndroid Build Coastguard Worker# CPP results example:
45*1b3f573fSAndroid Build Coastguard Worker# [
46*1b3f573fSAndroid Build Coastguard Worker#   "benchmarks": [
47*1b3f573fSAndroid Build Coastguard Worker#     {
48*1b3f573fSAndroid Build Coastguard Worker#       "bytes_per_second": int,
49*1b3f573fSAndroid Build Coastguard Worker#       "cpu_time_ns": double,
50*1b3f573fSAndroid Build Coastguard Worker#       "iterations": int,
51*1b3f573fSAndroid Build Coastguard Worker#       "name: string,
52*1b3f573fSAndroid Build Coastguard Worker#       "real_time_ns: double,
53*1b3f573fSAndroid Build Coastguard Worker#       ...
54*1b3f573fSAndroid Build Coastguard Worker#     },
55*1b3f573fSAndroid Build Coastguard Worker#     ...
56*1b3f573fSAndroid Build Coastguard Worker#   ],
57*1b3f573fSAndroid Build Coastguard Worker#   ...
58*1b3f573fSAndroid Build Coastguard Worker# ]
59*1b3f573fSAndroid Build Coastguard Workerdef __parse_cpp_result(filename):
60*1b3f573fSAndroid Build Coastguard Worker  if filename == "":
61*1b3f573fSAndroid Build Coastguard Worker    return
62*1b3f573fSAndroid Build Coastguard Worker  if filename[0] != '/':
63*1b3f573fSAndroid Build Coastguard Worker    filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
64*1b3f573fSAndroid Build Coastguard Worker  with open(filename, encoding="utf-8") as f:
65*1b3f573fSAndroid Build Coastguard Worker    results = json.loads(f.read())
66*1b3f573fSAndroid Build Coastguard Worker    for benchmark in results["benchmarks"]:
67*1b3f573fSAndroid Build Coastguard Worker      data_filename = "".join(
68*1b3f573fSAndroid Build Coastguard Worker          re.split("(_parse_|_serialize)", benchmark["name"])[0])
69*1b3f573fSAndroid Build Coastguard Worker      behavior = benchmark["name"][len(data_filename) + 1:]
70*1b3f573fSAndroid Build Coastguard Worker      if data_filename[:2] == "BM":
71*1b3f573fSAndroid Build Coastguard Worker        data_filename = data_filename[3:]
72*1b3f573fSAndroid Build Coastguard Worker      __results.append({
73*1b3f573fSAndroid Build Coastguard Worker        "language": "cpp",
74*1b3f573fSAndroid Build Coastguard Worker        "dataFilename": data_filename,
75*1b3f573fSAndroid Build Coastguard Worker        "behavior": behavior,
76*1b3f573fSAndroid Build Coastguard Worker        "throughput": benchmark["bytes_per_second"] / 2.0 ** 20
77*1b3f573fSAndroid Build Coastguard Worker      })
78*1b3f573fSAndroid Build Coastguard Worker
79*1b3f573fSAndroid Build Coastguard Worker
80*1b3f573fSAndroid Build Coastguard Worker# Synthetic benchmark results example:
81*1b3f573fSAndroid Build Coastguard Worker# [
82*1b3f573fSAndroid Build Coastguard Worker#   "benchmarks": [
83*1b3f573fSAndroid Build Coastguard Worker#     {
84*1b3f573fSAndroid Build Coastguard Worker#       "cpu_time_ns": double,
85*1b3f573fSAndroid Build Coastguard Worker#       "iterations": int,
86*1b3f573fSAndroid Build Coastguard Worker#       "name: string,
87*1b3f573fSAndroid Build Coastguard Worker#       "real_time_ns: double,
88*1b3f573fSAndroid Build Coastguard Worker#       ...
89*1b3f573fSAndroid Build Coastguard Worker#     },
90*1b3f573fSAndroid Build Coastguard Worker#     ...
91*1b3f573fSAndroid Build Coastguard Worker#   ],
92*1b3f573fSAndroid Build Coastguard Worker#   ...
93*1b3f573fSAndroid Build Coastguard Worker# ]
94*1b3f573fSAndroid Build Coastguard Workerdef __parse_synthetic_result(filename):
95*1b3f573fSAndroid Build Coastguard Worker  if filename == "":
96*1b3f573fSAndroid Build Coastguard Worker    return
97*1b3f573fSAndroid Build Coastguard Worker  if filename[0] != "/":
98*1b3f573fSAndroid Build Coastguard Worker    filename = os.path.dirname(os.path.abspath(__file__)) + "/" + filename
99*1b3f573fSAndroid Build Coastguard Worker  with open(filename, encoding="utf-8") as f:
100*1b3f573fSAndroid Build Coastguard Worker    results = json.loads(f.read())
101*1b3f573fSAndroid Build Coastguard Worker    for benchmark in results["benchmarks"]:
102*1b3f573fSAndroid Build Coastguard Worker      __results.append({
103*1b3f573fSAndroid Build Coastguard Worker          "language": "cpp",
104*1b3f573fSAndroid Build Coastguard Worker          "dataFilename": "",
105*1b3f573fSAndroid Build Coastguard Worker          "behavior": "synthetic",
106*1b3f573fSAndroid Build Coastguard Worker          "throughput": 10.0**9 / benchmark["cpu_time_ns"]
107*1b3f573fSAndroid Build Coastguard Worker      })
108*1b3f573fSAndroid Build Coastguard Worker
109*1b3f573fSAndroid Build Coastguard Worker
110*1b3f573fSAndroid Build Coastguard Worker# Python results example:
111*1b3f573fSAndroid Build Coastguard Worker# [
112*1b3f573fSAndroid Build Coastguard Worker#   [
113*1b3f573fSAndroid Build Coastguard Worker#     {
114*1b3f573fSAndroid Build Coastguard Worker#       "filename": string,
115*1b3f573fSAndroid Build Coastguard Worker#       "benchmarks": {
116*1b3f573fSAndroid Build Coastguard Worker#         behavior: results,
117*1b3f573fSAndroid Build Coastguard Worker#         ...
118*1b3f573fSAndroid Build Coastguard Worker#       },
119*1b3f573fSAndroid Build Coastguard Worker#     },
120*1b3f573fSAndroid Build Coastguard Worker#     ...
121*1b3f573fSAndroid Build Coastguard Worker#   ], #pure-python
122*1b3f573fSAndroid Build Coastguard Worker#   ...
123*1b3f573fSAndroid Build Coastguard Worker# ]
124*1b3f573fSAndroid Build Coastguard Workerdef __parse_python_result(filename):
125*1b3f573fSAndroid Build Coastguard Worker  if filename == "":
126*1b3f573fSAndroid Build Coastguard Worker    return
127*1b3f573fSAndroid Build Coastguard Worker  if filename[0] != '/':
128*1b3f573fSAndroid Build Coastguard Worker    filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
129*1b3f573fSAndroid Build Coastguard Worker  with open(filename, encoding="utf-8") as f:
130*1b3f573fSAndroid Build Coastguard Worker    results_list = json.loads(f.read())
131*1b3f573fSAndroid Build Coastguard Worker    for results in results_list:
132*1b3f573fSAndroid Build Coastguard Worker      for result in results:
133*1b3f573fSAndroid Build Coastguard Worker        _, avg_size = __get_data_size(result["filename"])
134*1b3f573fSAndroid Build Coastguard Worker        for behavior in result["benchmarks"]:
135*1b3f573fSAndroid Build Coastguard Worker          __results.append({
136*1b3f573fSAndroid Build Coastguard Worker            "language": "python",
137*1b3f573fSAndroid Build Coastguard Worker            "dataFilename": __extract_file_name(result["filename"]),
138*1b3f573fSAndroid Build Coastguard Worker            "behavior": behavior,
139*1b3f573fSAndroid Build Coastguard Worker            "throughput": result["benchmarks"][behavior]
140*1b3f573fSAndroid Build Coastguard Worker          })
141*1b3f573fSAndroid Build Coastguard Worker
142*1b3f573fSAndroid Build Coastguard Worker
143*1b3f573fSAndroid Build Coastguard Worker# Java results example:
144*1b3f573fSAndroid Build Coastguard Worker# [
145*1b3f573fSAndroid Build Coastguard Worker#   {
146*1b3f573fSAndroid Build Coastguard Worker#     "id": string,
147*1b3f573fSAndroid Build Coastguard Worker#     "instrumentSpec": {...},
148*1b3f573fSAndroid Build Coastguard Worker#     "measurements": [
149*1b3f573fSAndroid Build Coastguard Worker#       {
150*1b3f573fSAndroid Build Coastguard Worker#         "weight": float,
151*1b3f573fSAndroid Build Coastguard Worker#         "value": {
152*1b3f573fSAndroid Build Coastguard Worker#           "magnitude": float,
153*1b3f573fSAndroid Build Coastguard Worker#           "unit": string
154*1b3f573fSAndroid Build Coastguard Worker#         },
155*1b3f573fSAndroid Build Coastguard Worker#         ...
156*1b3f573fSAndroid Build Coastguard Worker#       },
157*1b3f573fSAndroid Build Coastguard Worker#       ...
158*1b3f573fSAndroid Build Coastguard Worker#     ],
159*1b3f573fSAndroid Build Coastguard Worker#     "run": {...},
160*1b3f573fSAndroid Build Coastguard Worker#     "scenario": {
161*1b3f573fSAndroid Build Coastguard Worker#       "benchmarkSpec": {
162*1b3f573fSAndroid Build Coastguard Worker#         "methodName": string,
163*1b3f573fSAndroid Build Coastguard Worker#         "parameters": {
164*1b3f573fSAndroid Build Coastguard Worker#            defined parameters in the benchmark: parameters value
165*1b3f573fSAndroid Build Coastguard Worker#         },
166*1b3f573fSAndroid Build Coastguard Worker#         ...
167*1b3f573fSAndroid Build Coastguard Worker#       },
168*1b3f573fSAndroid Build Coastguard Worker#       ...
169*1b3f573fSAndroid Build Coastguard Worker#     }
170*1b3f573fSAndroid Build Coastguard Worker#
171*1b3f573fSAndroid Build Coastguard Worker#   },
172*1b3f573fSAndroid Build Coastguard Worker#   ...
173*1b3f573fSAndroid Build Coastguard Worker# ]
174*1b3f573fSAndroid Build Coastguard Workerdef __parse_java_result(filename):
175*1b3f573fSAndroid Build Coastguard Worker  if filename == "":
176*1b3f573fSAndroid Build Coastguard Worker    return
177*1b3f573fSAndroid Build Coastguard Worker  if filename[0] != '/':
178*1b3f573fSAndroid Build Coastguard Worker    filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
179*1b3f573fSAndroid Build Coastguard Worker  with open(filename, encoding="utf-8") as f:
180*1b3f573fSAndroid Build Coastguard Worker    results = json.loads(f.read())
181*1b3f573fSAndroid Build Coastguard Worker    for result in results:
182*1b3f573fSAndroid Build Coastguard Worker      total_weight = 0
183*1b3f573fSAndroid Build Coastguard Worker      total_value = 0
184*1b3f573fSAndroid Build Coastguard Worker      for measurement in result["measurements"]:
185*1b3f573fSAndroid Build Coastguard Worker        total_weight += measurement["weight"]
186*1b3f573fSAndroid Build Coastguard Worker        total_value += measurement["value"]["magnitude"]
187*1b3f573fSAndroid Build Coastguard Worker      avg_time = total_value * 1.0 / total_weight
188*1b3f573fSAndroid Build Coastguard Worker      total_size, _ = __get_data_size(
189*1b3f573fSAndroid Build Coastguard Worker          result["scenario"]["benchmarkSpec"]["parameters"]["dataFile"])
190*1b3f573fSAndroid Build Coastguard Worker      __results.append({
191*1b3f573fSAndroid Build Coastguard Worker        "language": "java",
192*1b3f573fSAndroid Build Coastguard Worker        "throughput": total_size / avg_time * 1e9 / 2 ** 20,
193*1b3f573fSAndroid Build Coastguard Worker        "behavior": result["scenario"]["benchmarkSpec"]["methodName"],
194*1b3f573fSAndroid Build Coastguard Worker        "dataFilename": __extract_file_name(
195*1b3f573fSAndroid Build Coastguard Worker            result["scenario"]["benchmarkSpec"]["parameters"]["dataFile"])
196*1b3f573fSAndroid Build Coastguard Worker      })
197*1b3f573fSAndroid Build Coastguard Worker
198*1b3f573fSAndroid Build Coastguard Worker
199*1b3f573fSAndroid Build Coastguard Worker# Go benchmark results:
200*1b3f573fSAndroid Build Coastguard Worker#
201*1b3f573fSAndroid Build Coastguard Worker# goos: linux
202*1b3f573fSAndroid Build Coastguard Worker# goarch: amd64
203*1b3f573fSAndroid Build Coastguard Worker# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Unmarshal-12               3000      705784 ns/op
204*1b3f573fSAndroid Build Coastguard Worker# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Marshal-12                 2000      634648 ns/op
205*1b3f573fSAndroid Build Coastguard Worker# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Size-12                    5000      244174 ns/op
206*1b3f573fSAndroid Build Coastguard Worker# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Clone-12                    300     4120954 ns/op
207*1b3f573fSAndroid Build Coastguard Worker# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Merge-12                    300     4108632 ns/op
208*1b3f573fSAndroid Build Coastguard Worker# PASS
209*1b3f573fSAndroid Build Coastguard Worker# ok    _/usr/local/google/home/yilunchong/mygit/protobuf/benchmarks  124.173s
210*1b3f573fSAndroid Build Coastguard Workerdef __parse_go_result(filename):
211*1b3f573fSAndroid Build Coastguard Worker  if filename == "":
212*1b3f573fSAndroid Build Coastguard Worker    return
213*1b3f573fSAndroid Build Coastguard Worker  if filename[0] != '/':
214*1b3f573fSAndroid Build Coastguard Worker    filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
215*1b3f573fSAndroid Build Coastguard Worker  with open(filename, encoding="utf-8") as f:
216*1b3f573fSAndroid Build Coastguard Worker    for line in f:
217*1b3f573fSAndroid Build Coastguard Worker      result_list = re.split(r"[\ \t]+", line)
218*1b3f573fSAndroid Build Coastguard Worker      if result_list[0][:9] != "Benchmark":
219*1b3f573fSAndroid Build Coastguard Worker        continue
220*1b3f573fSAndroid Build Coastguard Worker      first_slash_index = result_list[0].find('/')
221*1b3f573fSAndroid Build Coastguard Worker      last_slash_index = result_list[0].rfind('/')
222*1b3f573fSAndroid Build Coastguard Worker      full_filename = result_list[0][first_slash_index+1:last_slash_index]
223*1b3f573fSAndroid Build Coastguard Worker      total_bytes, _ = __get_data_size(full_filename)
224*1b3f573fSAndroid Build Coastguard Worker      behavior_with_suffix = result_list[0][last_slash_index+1:]
225*1b3f573fSAndroid Build Coastguard Worker      last_dash = behavior_with_suffix.rfind("-")
226*1b3f573fSAndroid Build Coastguard Worker      if last_dash == -1:
227*1b3f573fSAndroid Build Coastguard Worker        behavior = behavior_with_suffix
228*1b3f573fSAndroid Build Coastguard Worker      else:
229*1b3f573fSAndroid Build Coastguard Worker        behavior = behavior_with_suffix[:last_dash]
230*1b3f573fSAndroid Build Coastguard Worker      __results.append({
231*1b3f573fSAndroid Build Coastguard Worker        "dataFilename": __extract_file_name(full_filename),
232*1b3f573fSAndroid Build Coastguard Worker        "throughput": total_bytes / float(result_list[2]) * 1e9 / 2 ** 20,
233*1b3f573fSAndroid Build Coastguard Worker        "behavior": behavior,
234*1b3f573fSAndroid Build Coastguard Worker        "language": "go"
235*1b3f573fSAndroid Build Coastguard Worker      })
236*1b3f573fSAndroid Build Coastguard Worker
237*1b3f573fSAndroid Build Coastguard Worker
238*1b3f573fSAndroid Build Coastguard Worker# Self built json results example:
239*1b3f573fSAndroid Build Coastguard Worker#
240*1b3f573fSAndroid Build Coastguard Worker# [
241*1b3f573fSAndroid Build Coastguard Worker#   {
242*1b3f573fSAndroid Build Coastguard Worker#     "filename": string,
243*1b3f573fSAndroid Build Coastguard Worker#     "benchmarks": {
244*1b3f573fSAndroid Build Coastguard Worker#       behavior: results,
245*1b3f573fSAndroid Build Coastguard Worker#       ...
246*1b3f573fSAndroid Build Coastguard Worker#     },
247*1b3f573fSAndroid Build Coastguard Worker#   },
248*1b3f573fSAndroid Build Coastguard Worker#   ...
249*1b3f573fSAndroid Build Coastguard Worker# ]
250*1b3f573fSAndroid Build Coastguard Workerdef __parse_custom_result(filename, language):
251*1b3f573fSAndroid Build Coastguard Worker  if filename == "":
252*1b3f573fSAndroid Build Coastguard Worker    return
253*1b3f573fSAndroid Build Coastguard Worker  if filename[0] != '/':
254*1b3f573fSAndroid Build Coastguard Worker    filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
255*1b3f573fSAndroid Build Coastguard Worker  with open(filename, encoding="utf-8") as f:
256*1b3f573fSAndroid Build Coastguard Worker    results = json.loads(f.read())
257*1b3f573fSAndroid Build Coastguard Worker    for result in results:
258*1b3f573fSAndroid Build Coastguard Worker      _, avg_size = __get_data_size(result["filename"])
259*1b3f573fSAndroid Build Coastguard Worker      for behavior in result["benchmarks"]:
260*1b3f573fSAndroid Build Coastguard Worker        __results.append({
261*1b3f573fSAndroid Build Coastguard Worker          "language": language,
262*1b3f573fSAndroid Build Coastguard Worker          "dataFilename": __extract_file_name(result["filename"]),
263*1b3f573fSAndroid Build Coastguard Worker          "behavior": behavior,
264*1b3f573fSAndroid Build Coastguard Worker          "throughput": result["benchmarks"][behavior]
265*1b3f573fSAndroid Build Coastguard Worker        })
266*1b3f573fSAndroid Build Coastguard Worker
267*1b3f573fSAndroid Build Coastguard Worker
268*1b3f573fSAndroid Build Coastguard Workerdef __parse_js_result(filename, language):
269*1b3f573fSAndroid Build Coastguard Worker  return __parse_custom_result(filename, language)
270*1b3f573fSAndroid Build Coastguard Worker
271*1b3f573fSAndroid Build Coastguard Workerdef __parse_php_result(filename, language):
272*1b3f573fSAndroid Build Coastguard Worker  return __parse_custom_result(filename, language)
273*1b3f573fSAndroid Build Coastguard Worker
274*1b3f573fSAndroid Build Coastguard Worker
275*1b3f573fSAndroid Build Coastguard Workerdef get_result_from_file(cpp_file="",
276*1b3f573fSAndroid Build Coastguard Worker                         java_file="",
277*1b3f573fSAndroid Build Coastguard Worker                         python_file="",
278*1b3f573fSAndroid Build Coastguard Worker                         go_file="",
279*1b3f573fSAndroid Build Coastguard Worker                         synthetic_file="",
280*1b3f573fSAndroid Build Coastguard Worker                         node_file="",
281*1b3f573fSAndroid Build Coastguard Worker                         php_c_file="",
282*1b3f573fSAndroid Build Coastguard Worker                         php_file=""):
283*1b3f573fSAndroid Build Coastguard Worker  results = {}
284*1b3f573fSAndroid Build Coastguard Worker  if cpp_file != "":
285*1b3f573fSAndroid Build Coastguard Worker    __parse_cpp_result(cpp_file)
286*1b3f573fSAndroid Build Coastguard Worker  if java_file != "":
287*1b3f573fSAndroid Build Coastguard Worker    __parse_java_result(java_file)
288*1b3f573fSAndroid Build Coastguard Worker  if python_file != "":
289*1b3f573fSAndroid Build Coastguard Worker    __parse_python_result(python_file)
290*1b3f573fSAndroid Build Coastguard Worker  if go_file != "":
291*1b3f573fSAndroid Build Coastguard Worker    __parse_go_result(go_file)
292*1b3f573fSAndroid Build Coastguard Worker  if synthetic_file != "":
293*1b3f573fSAndroid Build Coastguard Worker    __parse_synthetic_result(synthetic_file)
294*1b3f573fSAndroid Build Coastguard Worker  if node_file != "":
295*1b3f573fSAndroid Build Coastguard Worker    __parse_js_result(node_file, "node")
296*1b3f573fSAndroid Build Coastguard Worker  if php_file != "":
297*1b3f573fSAndroid Build Coastguard Worker    __parse_php_result(php_file, "php")
298*1b3f573fSAndroid Build Coastguard Worker  if php_c_file != "":
299*1b3f573fSAndroid Build Coastguard Worker    __parse_php_result(php_c_file, "php")
300*1b3f573fSAndroid Build Coastguard Worker
301*1b3f573fSAndroid Build Coastguard Worker  return __results
302*1b3f573fSAndroid Build Coastguard Worker
303*1b3f573fSAndroid Build Coastguard Worker
304*1b3f573fSAndroid Build Coastguard Workerif __name__ == "__main__":
305*1b3f573fSAndroid Build Coastguard Worker  parser = argparse.ArgumentParser()
306*1b3f573fSAndroid Build Coastguard Worker  parser.add_argument(
307*1b3f573fSAndroid Build Coastguard Worker      "-cpp",
308*1b3f573fSAndroid Build Coastguard Worker      "--cpp_input_file",
309*1b3f573fSAndroid Build Coastguard Worker      help="The CPP benchmark result file's name",
310*1b3f573fSAndroid Build Coastguard Worker      default="")
311*1b3f573fSAndroid Build Coastguard Worker  parser.add_argument(
312*1b3f573fSAndroid Build Coastguard Worker      "-java",
313*1b3f573fSAndroid Build Coastguard Worker      "--java_input_file",
314*1b3f573fSAndroid Build Coastguard Worker      help="The Java benchmark result file's name",
315*1b3f573fSAndroid Build Coastguard Worker      default="")
316*1b3f573fSAndroid Build Coastguard Worker  parser.add_argument(
317*1b3f573fSAndroid Build Coastguard Worker      "-python",
318*1b3f573fSAndroid Build Coastguard Worker      "--python_input_file",
319*1b3f573fSAndroid Build Coastguard Worker      help="The Python benchmark result file's name",
320*1b3f573fSAndroid Build Coastguard Worker      default="")
321*1b3f573fSAndroid Build Coastguard Worker  parser.add_argument(
322*1b3f573fSAndroid Build Coastguard Worker      "-go",
323*1b3f573fSAndroid Build Coastguard Worker      "--go_input_file",
324*1b3f573fSAndroid Build Coastguard Worker      help="The golang benchmark result file's name",
325*1b3f573fSAndroid Build Coastguard Worker      default="")
326*1b3f573fSAndroid Build Coastguard Worker  parser.add_argument(
327*1b3f573fSAndroid Build Coastguard Worker      "-node",
328*1b3f573fSAndroid Build Coastguard Worker      "--node_input_file",
329*1b3f573fSAndroid Build Coastguard Worker      help="The node.js benchmark result file's name",
330*1b3f573fSAndroid Build Coastguard Worker      default="")
331*1b3f573fSAndroid Build Coastguard Worker  parser.add_argument(
332*1b3f573fSAndroid Build Coastguard Worker      "-php",
333*1b3f573fSAndroid Build Coastguard Worker      "--php_input_file",
334*1b3f573fSAndroid Build Coastguard Worker      help="The pure php benchmark result file's name",
335*1b3f573fSAndroid Build Coastguard Worker      default="")
336*1b3f573fSAndroid Build Coastguard Worker  parser.add_argument(
337*1b3f573fSAndroid Build Coastguard Worker      "-php_c",
338*1b3f573fSAndroid Build Coastguard Worker      "--php_c_input_file",
339*1b3f573fSAndroid Build Coastguard Worker      help="The php with c ext benchmark result file's name",
340*1b3f573fSAndroid Build Coastguard Worker      default="")
341*1b3f573fSAndroid Build Coastguard Worker  args = parser.parse_args()
342*1b3f573fSAndroid Build Coastguard Worker
343*1b3f573fSAndroid Build Coastguard Worker  results = get_result_from_file(
344*1b3f573fSAndroid Build Coastguard Worker      cpp_file=args.cpp_input_file,
345*1b3f573fSAndroid Build Coastguard Worker      java_file=args.java_input_file,
346*1b3f573fSAndroid Build Coastguard Worker      python_file=args.python_input_file,
347*1b3f573fSAndroid Build Coastguard Worker      go_file=args.go_input_file,
348*1b3f573fSAndroid Build Coastguard Worker      node_file=args.node_input_file,
349*1b3f573fSAndroid Build Coastguard Worker      php_file=args.php_input_file,
350*1b3f573fSAndroid Build Coastguard Worker      php_c_file=args.php_c_input_file,
351*1b3f573fSAndroid Build Coastguard Worker  )
352*1b3f573fSAndroid Build Coastguard Worker  print(json.dumps(results, indent=2))
353