You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

86 lines
2.9 KiB

import sys
import os
import pathlib
import argparse
import subprocess
import json
from datetime import datetime
import pandas
def create_parser():
parser = argparse.ArgumentParser(
description="Run a comparison between IPC and our method.")
parser.add_argument(
"-i", "--input", metavar="path/to/input", type=pathlib.Path,
dest="input", help="path to input json(s)", nargs="+")
parser.add_argument(
"-o", "--output", metavar="path/to/combined-profiles.csv",
type=pathlib.Path, dest="output",
default=pathlib.Path("combined-profiles.csv"),
help="path to output CSV")
parser.add_argument(
"--absolute-time", action="store_true", default=False,
help="save absolute times (seconds) instead of percentages")
return parser
def parse_arguments():
parser = create_parser()
args = parser.parse_args()
input = []
for input_file in args.input:
if input_file.is_file() and input_file.suffix == ".json":
input.append(input_file.resolve())
elif input_file.is_dir():
for script_file in input_file.glob('**/*.json'):
input.append(script_file.resolve())
args.input = input
return args
def append_stem(p, stem_suffix):
# return p.with_stem(p.stem + stem_suffix)
return p.parent / (p.stem + stem_suffix + p.suffix)
def combine_profiles(fixtures, absolute_time=False, base_output=None):
fixtures_dir = pathlib.Path(__file__).resolve().parents[1] / "fixtures"
combined_profile = pandas.DataFrame()
for fixture in fixtures:
fixture_name = fixture.relative_to(fixtures_dir)
sim_output = ((base_output if base_output is not None else "output")
/ fixture_name.parent / fixture_name.stem)
fixture_name = str(fixture_name.parent / fixture_name.stem)
log_dirs = list(filter(lambda p: p.is_dir(), sim_output.glob("log*")))
if log_dirs:
profiler_dir = max(log_dirs, key=os.path.getmtime)
profiler_df = pandas.read_csv(
profiler_dir / "summary.csv", header=1, index_col=0,
skipinitialspace=True)
profile_col = pandas.DataFrame(index=profiler_df.index.values)
if absolute_time:
profile_col[fixture_name] = profiler_df["total_time (sec)"]
else:
profile_col[fixture_name] = profiler_df["percentage_time"]
combined_profile = pandas.concat(
[combined_profile, profile_col], axis=1)
else:
pass
# print("Cannot find profiler summary for "
# f"{fixture} at {sim_output}!")
return combined_profile
def main():
args = parse_arguments()
combined_profile_df = combine_profiles(args.input, args.absolute_time)
combined_profile_df.to_csv(args.output)
print(f"Combined profile written to {args.output}")
if __name__ == "__main__":
main()