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.

87 lines
2.9 KiB

2 years ago
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()