#!/usr/bin/python2 # Copyright Martin J. Bligh (mbligh@google.com) # Released under the GPL, v2 from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import re import sys results_per_sign = 10 def parse_lines(filename): results = [] start_key = 1 for line in open(filename).readlines(): try: a = line.split() key = ' '.join(a[start_key:]) count = int(a[0]) results.append((key, count)) except: # presumably a header line if re.match(r'samples\s*%\s*app name\s*symbol name', line): start_key = 2 elif re.match(r'samples\s*%\s*image name\s*app name\s*symbol name', line): start_key = 3 return results # Firstly, suck in both files. orig = {} new = {} diff = {} for (key, count) in parse_lines(sys.argv[1]): # Oprofile seems to be ... erm ... broken. Keys can appear > once ;-( if key in orig: orig[key] += count else: orig[key] = count if key in diff: diff[key] -= count else: diff[key] = -count for (key, count) in parse_lines(sys.argv[2]): if key in new: new[key] += count else: new[key] = count if key in diff: diff[key] += count else: diff[key] = count if len(orig) < 2* results_per_sign or len(new) < 2 * results_per_sign: sys.exit(1) # one of the files was blank? # Now sort and print the diffs. def print_key(key): if key in orig and orig[key] > 0: pct = (100 * diff[key]) / orig[key] else: pct = 0 print("%10d %6.1f%% %s" % (diff[key], pct, key)) keys = sorted(list(diff.keys()), key=lambda x: diff[x], reverse=True) for key in keys[:results_per_sign]: print_key(key) print("\n...\n") for key in keys[len(keys)-results_per_sign:]: print_key(key)