xref: /aosp_15_r20/external/autotest/client/tools/diffprofile (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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