1*da0073e9SAndroid Build Coastguard Worker# This script takes csvs produced by parse_logs.py and combines them 2*da0073e9SAndroid Build Coastguard Worker# into a single CSV file 3*da0073e9SAndroid Build Coastguard Worker 4*da0073e9SAndroid Build Coastguard Workerimport ast 5*da0073e9SAndroid Build Coastguard Workerimport csv 6*da0073e9SAndroid Build Coastguard Workerimport sys 7*da0073e9SAndroid Build Coastguard Workerfrom collections import defaultdict 8*da0073e9SAndroid Build Coastguard Worker 9*da0073e9SAndroid Build Coastguard Worker 10*da0073e9SAndroid Build Coastguard Workerassert len(sys.argv) == 3 11*da0073e9SAndroid Build Coastguard Worker 12*da0073e9SAndroid Build Coastguard WorkerRESULTS = defaultdict(dict) 13*da0073e9SAndroid Build Coastguard Worker 14*da0073e9SAndroid Build Coastguard Workerfor side, f in zip(["static", "dynamic"], sys.argv[1:]): 15*da0073e9SAndroid Build Coastguard Worker with open(f) as f: 16*da0073e9SAndroid Build Coastguard Worker reader = csv.DictReader(f) 17*da0073e9SAndroid Build Coastguard Worker for row in reader: 18*da0073e9SAndroid Build Coastguard Worker RESULTS[(row["bench"], row["name"])][side] = row 19*da0073e9SAndroid Build Coastguard Worker 20*da0073e9SAndroid Build Coastguard Workerfields = ["frame_time", "graph_breaks"] 21*da0073e9SAndroid Build Coastguard Worker 22*da0073e9SAndroid Build Coastguard Workerout = csv.DictWriter( 23*da0073e9SAndroid Build Coastguard Worker sys.stdout, 24*da0073e9SAndroid Build Coastguard Worker ["bench", "name"] + [f"delta_{n}" for n in fields] + ["static_url", "dynamic_url"], 25*da0073e9SAndroid Build Coastguard Worker dialect="excel", 26*da0073e9SAndroid Build Coastguard Worker) 27*da0073e9SAndroid Build Coastguard Workerout.writeheader() 28*da0073e9SAndroid Build Coastguard Worker 29*da0073e9SAndroid Build Coastguard Workerfor (bench, name), sides in RESULTS.items(): 30*da0073e9SAndroid Build Coastguard Worker if "static" not in sides: 31*da0073e9SAndroid Build Coastguard Worker continue 32*da0073e9SAndroid Build Coastguard Worker if "dynamic" not in sides: 33*da0073e9SAndroid Build Coastguard Worker continue 34*da0073e9SAndroid Build Coastguard Worker if not name: 35*da0073e9SAndroid Build Coastguard Worker out.writerow( 36*da0073e9SAndroid Build Coastguard Worker { 37*da0073e9SAndroid Build Coastguard Worker "static_url": sides["static"]["explain"], 38*da0073e9SAndroid Build Coastguard Worker "dynamic_url": sides["dynamic"]["explain"], 39*da0073e9SAndroid Build Coastguard Worker } 40*da0073e9SAndroid Build Coastguard Worker ) 41*da0073e9SAndroid Build Coastguard Worker continue 42*da0073e9SAndroid Build Coastguard Worker row = {"bench": bench, "name": name} 43*da0073e9SAndroid Build Coastguard Worker for f in fields: 44*da0073e9SAndroid Build Coastguard Worker try: 45*da0073e9SAndroid Build Coastguard Worker static = ast.literal_eval(sides["static"][f]) 46*da0073e9SAndroid Build Coastguard Worker dynamic = ast.literal_eval(sides["dynamic"][f]) 47*da0073e9SAndroid Build Coastguard Worker except SyntaxError: 48*da0073e9SAndroid Build Coastguard Worker continue 49*da0073e9SAndroid Build Coastguard Worker row[f"delta_{f}"] = dynamic - static 50*da0073e9SAndroid Build Coastguard Worker out.writerow(row) 51