#!/usr/bin/env python3 import argparse import csv import json import sys def main(argv): parser = argparse.ArgumentParser( prog='parse-google-benchmark-results', description='Parse Google Benchmark result files (in JSON format) into CSV or LNT compatible output.') parser.add_argument('filename', type=argparse.FileType('r'), nargs='+', help='One of more JSON files to extract the results from. The results parsed from each ' 'file are concatenated together.') parser.add_argument('--timing', type=str, choices=['real_time', 'cpu_time'], default='real_time', help='The timing to extract from the Google Benchmark results. This can either be the ' '"real time" or the "CPU time". Default is "real time".') parser.add_argument('--output-format', type=str, choices=['csv', 'lnt'], default='csv', help='The desired output format for the data. `csv` is CSV format and `lnt` is a format compatible with ' '`lnt importreport` (see https://llvm.org/docs/lnt/importing_data.html#importing-data-in-a-text-file).') args = parser.parse_args(argv) # Parse the data from all files, aggregating the results headers = ['Benchmark', args.timing] rows = [] for file in args.filename: js = json.load(file) for bm in js['benchmarks']: if args.timing not in bm: raise RuntimeError(f'Benchmark does not contain key for {args.timing}: {bm}') row = [bm['name'], bm[args.timing]] rows.append(row) # Print the results in the right format if args.output_format == 'csv': writer = csv.writer(sys.stdout) writer.writerow(headers) for row in rows: writer.writerow(row) elif args.output_format == 'lnt': benchmark = headers.index('Benchmark') time = headers.index(args.timing) for row in rows: # LNT format uses '.' to separate the benchmark name from the metric, and ' ' # to separate the benchmark name + metric from the numerical value. Escape both. escaped = row[benchmark].replace(".", "_").replace(" ", "_") print(f'{escaped}.execution_time {row[time]}') if __name__ == '__main__': main(sys.argv[1:])