android_external_ffmpeg/pi-util/perfcmp.py
2025-06-24 22:46:48 -05:00

101 lines
3 KiB
Python
Executable file

#!/usr/bin/env python3
import time
import string
import os
import tempfile
import subprocess
import re
import argparse
import sys
import csv
from stat import *
class tstats:
close_threshold = 0.01
def __init__(self, stats_dict=None):
if stats_dict != None:
self.name = stats_dict["name"]
self.elapsed = float(stats_dict["elapsed"])
self.user = float(stats_dict["user"])
self.sys = float(stats_dict["sys"])
def times_str(self):
ctime = self.sys + self.user
return "time=%6.2f, cpu=%6.2f (%4.2f%%)" % (self.elapsed, ctime, (ctime * 100.0) / self.elapsed)
def dict(self):
return {"name":self.name, "elapsed":self.elapsed, "user":self.user, "sys":self.sys}
def is_close(self, other):
return abs(self.elapsed - other.elapsed) / self.elapsed < self.close_threshold
def __lt__(self, other):
return self.elapsed < other.elapsed
def __gt__(self, other):
return self.elapsed > other.elapsed
def time_file(name, prefix):
stats = tstats()
stats.name = name
start_time = time.clock_gettime(time.CLOCK_MONOTONIC);
cproc = subprocess.Popen(["./ffmpeg", "-t", "30", "-i", prefix + name,
"-f", "null", os.devnull], bufsize=-1, stdout=flog, stderr=flog);
pinfo = os.wait4(cproc.pid, 0)
end_time = time.clock_gettime(time.CLOCK_MONOTONIC);
stats.elapsed = end_time - start_time
stats.user = pinfo[2].ru_utime
stats.sys = pinfo[2].ru_stime
return stats
def common_prefix(s1, s2):
for i in range(min(len(s1),len(s2))):
if s1[i] != s2[i]:
return s1[:i]
return s1[:i+1]
def main():
argp = argparse.ArgumentParser(description="FFmpeg performance compare")
argp.add_argument("stream0", help="CSV to compare")
argp.add_argument("stream1", nargs='?', default="ffperf_out.csv", help="CSV to compare")
args = argp.parse_args()
with open(args.stream0, 'r', newline='') as f_in:
stats0 = {x["name"]:tstats(x) for x in csv.DictReader(f_in)}
with open(args.stream1, 'r', newline='') as f_in:
stats1 = {x["name"]:tstats(x) for x in csv.DictReader(f_in)}
print (args.stream0, "<<-->>", args.stream1)
print ()
for f in sorted(stats0.keys() | stats1.keys(), key=lambda x : "~" * x.count(os.sep) + x.lower()):
if not (f in stats0) :
print (" XX :", f)
continue
if not (f in stats1) :
print (" XX :", f)
continue
s0 = stats0[f]
s1 = stats1[f]
pcent = ((s0.elapsed - s1.elapsed) / s0.elapsed) * 100.0
thresh = 0.3
tc = 6
nchar = min(tc - 1, int(abs(pcent) / thresh))
cc = " -- " if nchar == 0 else "<" * nchar + " " * (tc - nchar) if pcent < 0 else " " * (tc - nchar) + ">" * nchar
print ("%6.2f %s%6.2f (%+5.2f) : %s" %
(s0.elapsed, cc, s1.elapsed, pcent, f))
return 0
if __name__ == '__main__':
exit(main())