#!/usr/bin/env python3 import sys from pprint import pprint # Unused line numbers required by kcachegrind. POS = '1' def nameFromNode(tree): name = tree['name'] pos = tree['pos'] if pos.endswith(": "): pos = pos[:-2] return (name, pos) def addFuncNames(tree, s): s.add(nameFromNode(tree)) for child in tree['children']: addFuncNames(child, s) def funcNames(tree): s = set() addFuncNames(tree, s) return s def computeTotals(tree): for child in tree['children']: computeTotals(child) tree['instTotal'] = (tree['instructions'] + sum(child['instTotal'] for child in tree['children'])) tree['nsecsTotal'] = (tree['nsecs'] + sum(child['nsecsTotal'] for child in tree['children'])) def printName(name, prefix=''): print (prefix+"fl=", name[1]) print (prefix+"fn=", name[0]) class Arc: def __init__(self): self.calls = 0 self.instTotal = 0 self.nsecsTotal = 0 def add(self, tree): self.calls += tree['calls'] self.instTotal += tree['instTotal'] self.nsecsTotal += tree['nsecsTotal'] class Func: def __init__(self): self.instructions = 0 self.nsecs = 0 self.arcs = {} def addChildTime(self, tree): arc = self.arcs.setdefault(nameFromNode(tree), Arc()) arc.add(tree) def analyse(self, tree): self.instructions += tree['instructions'] self.nsecs += tree['nsecs'] for child in tree['children']: self.addChildTime(child) def dump(self): print (POS, self.instructions, self.nsecs) for name in self.arcs: printName(name, prefix='c') arc = self.arcs[name] print ("calls="+str(arc.calls), POS) print (POS, arc.instTotal, arc.nsecsTotal) print () def analyse(funcs, tree): funcs[nameFromNode(tree)].analyse(tree) for child in tree['children']: analyse(funcs, child) def dump(funcs): print ("events: Instructions Nanoseconds") for name in funcs: printName(name) funcs[name].dump() rawdata = __import__("asyprof") profile = rawdata.profile computeTotals(profile) names = funcNames(profile) funcs = {} for name in names: funcs[name] = Func() analyse(funcs, profile) dump(funcs) #pprint(names)