#!/usr/bin/python3 """ Parse a systrace file with NNAPI traces to calculate timing statistics This is script to be run from the command line. Usage: $ cd $ ./parse_systrace.py $ ./parse_systrace.py --help For the parsing logic, see contract-between-code-and-parser.txt """ import argparse import sys from parser.input import get_trace_part, parse_trace_part from parser.output import print_stats, reset_trackers from parser.tracker import Tracker, AppPhase def produce_stats(trace, print_detail=False, total_times=False, per_execution=False, json=False): """ Take a string with the systrace html file's trace part, possibly containing multiple application runs, feed the trace to Tracker objects and print stats for each run.""" tracked_pids, driver_tgids, parsed = parse_trace_part(trace) tracker_map = {} app_phase = AppPhase() for pid in tracked_pids: tgid = tracked_pids[pid] tracker_map[pid] = Tracker(pid, driver_tgids.get(tgid, False), app_phase) first = True starting_mark = '' printed_one = False if json: sep = "[" else: sep = "" for [task, pid, tgid, time, mark, line, lineno] in parsed: if ("HIDL::IDevice" in mark) or ("[NN_" in mark): assert tracker_map.get(pid), "Cannot find PID %s in tracker_map" % pid if tracker_map.get(pid): if "[NN_LA_PO]" in mark: # Next run if not first: if json and printed_one: sep = "," printed_one = True print_stats(tracker_map, print_detail, total_times, per_execution, json, starting_mark, sep) reset_trackers(tracker_map) app_phase.reset() starting_mark = mark first = False try: tracker_map[pid].handle_mark(time, mark) except Exception as e: print("failed on line", lineno, line) raise if json and printed_one: sep = "," print_stats(tracker_map, print_detail, total_times, per_execution, json, starting_mark, sep) if json: print("]") if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('--print-detail', action='store_true') parser.add_argument('--total-times', action='store_true') parser.add_argument('--per-execution', action='store_true') parser.add_argument('--json', action='store_true') parser.add_argument('filename') args = parser.parse_args() trace = get_trace_part(args.filename) produce_stats(trace, args.print_detail, args.total_times, args.per_execution, args.json)