1*9c5db199SXin Li#!/usr/bin/python3 2*9c5db199SXin Li# Copyright Martin J. Bligh ([email protected]) 3*9c5db199SXin Li# Released under the GPL, v2 4*9c5db199SXin Li 5*9c5db199SXin Lifrom __future__ import absolute_import 6*9c5db199SXin Lifrom __future__ import division 7*9c5db199SXin Lifrom __future__ import print_function 8*9c5db199SXin Li 9*9c5db199SXin Liimport os 10*9c5db199SXin Liimport re 11*9c5db199SXin Liimport sys 12*9c5db199SXin Li 13*9c5db199SXin Liresults_per_sign = 10 14*9c5db199SXin Li 15*9c5db199SXin Lidef parse_lines(filename): 16*9c5db199SXin Li results = [] 17*9c5db199SXin Li start_key = 1 18*9c5db199SXin Li for line in open(filename).readlines(): 19*9c5db199SXin Li try: 20*9c5db199SXin Li a = line.split() 21*9c5db199SXin Li key = ' '.join(a[start_key:]) 22*9c5db199SXin Li count = int(a[0]) 23*9c5db199SXin Li results.append((key, count)) 24*9c5db199SXin Li except: # presumably a header line 25*9c5db199SXin Li if re.match(r'samples\s*%\s*app name\s*symbol name', line): 26*9c5db199SXin Li start_key = 2 27*9c5db199SXin Li elif re.match(r'samples\s*%\s*image name\s*app name\s*symbol name', line): 28*9c5db199SXin Li start_key = 3 29*9c5db199SXin Li return results 30*9c5db199SXin Li 31*9c5db199SXin Li 32*9c5db199SXin Li# Firstly, suck in both files. 33*9c5db199SXin Liorig = {} 34*9c5db199SXin Linew = {} 35*9c5db199SXin Lidiff = {} 36*9c5db199SXin Li 37*9c5db199SXin Lifor (key, count) in parse_lines(sys.argv[1]): 38*9c5db199SXin Li # Oprofile seems to be ... erm ... broken. Keys can appear > once ;-( 39*9c5db199SXin Li if key in orig: 40*9c5db199SXin Li orig[key] += count 41*9c5db199SXin Li else: 42*9c5db199SXin Li orig[key] = count 43*9c5db199SXin Li if key in diff: 44*9c5db199SXin Li diff[key] -= count 45*9c5db199SXin Li else: 46*9c5db199SXin Li diff[key] = -count 47*9c5db199SXin Li 48*9c5db199SXin Lifor (key, count) in parse_lines(sys.argv[2]): 49*9c5db199SXin Li if key in new: 50*9c5db199SXin Li new[key] += count 51*9c5db199SXin Li else: 52*9c5db199SXin Li new[key] = count 53*9c5db199SXin Li if key in diff: 54*9c5db199SXin Li diff[key] += count 55*9c5db199SXin Li else: 56*9c5db199SXin Li diff[key] = count 57*9c5db199SXin Li 58*9c5db199SXin Liif len(orig) < 2* results_per_sign or len(new) < 2 * results_per_sign: 59*9c5db199SXin Li sys.exit(1) # one of the files was blank? 60*9c5db199SXin Li 61*9c5db199SXin Li# Now sort and print the diffs. 62*9c5db199SXin Lidef print_key(key): 63*9c5db199SXin Li if key in orig and orig[key] > 0: 64*9c5db199SXin Li pct = (100 * diff[key]) / orig[key] 65*9c5db199SXin Li else: 66*9c5db199SXin Li pct = 0 67*9c5db199SXin Li print("%10d %6.1f%% %s" % (diff[key], pct, key)) 68*9c5db199SXin Li 69*9c5db199SXin Likeys = sorted(list(diff.keys()), key=lambda x: diff[x], reverse=True) 70*9c5db199SXin Li 71*9c5db199SXin Lifor key in keys[:results_per_sign]: 72*9c5db199SXin Li print_key(key) 73*9c5db199SXin Li 74*9c5db199SXin Liprint("\n...\n") 75*9c5db199SXin Li 76*9c5db199SXin Lifor key in keys[len(keys)-results_per_sign:]: 77*9c5db199SXin Li print_key(key) 78