dwarf-synthesis/tools/analyze_time.py

75 lines
1.9 KiB
Python
Executable file

#!/usr/bin/env python3
import sys
import re
from collections import namedtuple
import numpy as np
Timestamp = namedtuple("Timestamp", ["name", "timestamp"])
AvgNumber = namedtuple("AvgNumber", ["name", "avg", "sd"])
def read_ts_file(handle):
time_re = re.compile(
r"^\~\~TIME\~\~ (?P<name>[^[]*) \[(?P<timestamp>[0-9]+\.[0-9]+)\]$"
)
timestamps = []
for line in handle:
match = time_re.match(line.strip())
if match is None: # Not a timer line
continue
timestamps.append(
Timestamp(
name=match.group("name"), timestamp=float(match.group("timestamp"))
)
)
return timestamps
def analyze(timestamps):
assert timestamps
for ts in range(len(timestamps)):
if not timestamps[ts]:
print(ts)
assert timestamps[ts]
analyzed = []
for pos in range(len(timestamps[0]) - 1):
serie = [ts[pos + 1].timestamp - ts[pos].timestamp for ts in timestamps]
analyzed.append(
AvgNumber(
name=timestamps[0][pos].name,
avg=sum(serie) / len(serie),
sd=np.sqrt(np.var(serie)),
)
)
total_serie = [ts[-1].timestamp - ts[0].timestamp for ts in timestamps]
analyzed.append(
AvgNumber(
name="Total",
avg=sum(total_serie) / len(serie),
sd=np.sqrt(np.var(total_serie)),
)
)
return analyzed
analyze_paths = sys.argv[1:]
if not analyze_paths:
analyze_paths = ["-"]
timestamp_series = [
read_ts_file(sys.stdin if path == "-" else open(path, "r"))
for path in analyze_paths
]
analyzed_timestamps = analyze(timestamp_series)
for analyzed_ts in analyzed_timestamps:
print(
"{}: {:.3f}±{:.3f} sec".format(
analyzed_ts.name, analyzed_ts.avg, 2 * analyzed_ts.sd
)
)