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
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()
|
|
|