linux-yocto/scripts/bloat-o-meter
Jean Delvare c50e3f512a bloat-o-meter: include read-only data section in report
I'm not sure why the read-only data section is excluded from the report,
it seems as relevant as the other data sections (b and d).

I've stripped the symbols starting with __mod_ as they can have their
names dynamically generated and thus comparison between binaries is not
possible.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Cc: Andi Kleen <andi@firstfloor.org>
Acked-by: Nathan Lynch <ntl@pobox.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2011-03-22 17:44:17 -07:00

1.8 KiB
Executable File

#!/usr/bin/python

Copyright 2004 Matt Mackall mpm@selenic.com

inspired by perl Bloat-O-Meter (c) 1997 by Andi Kleen

This software may be used and distributed according to the terms

of the GNU General Public License, incorporated herein by reference.

import sys, os, re

if len(sys.argv) != 3: sys.stderr.write("usage: %s file1 file2\n" % sys.argv[0]) sys.exit(-1)

def getsizes(file): sym = {} for l in os.popen("nm --size-sort " + file).readlines(): size, type, name = l[:-1].split() if type in "tTdDbBrR": # strip generated symbols if name[:6] == "_mod": continue # function names begin with '.' on 64-bit powerpc if "." in name[1:]: name = "static." + name.split(".")[0] sym[name] = sym.get(name, 0) + int(size, 16) return sym

old = getsizes(sys.argv[1]) new = getsizes(sys.argv[2]) grow, shrink, add, remove, up, down = 0, 0, 0, 0, 0, 0 delta, common = [], {}

for a in old: if a in new: common[a] = 1

for name in old: if name not in common: remove += 1 down += old[name] delta.append((-old[name], name))

for name in new: if name not in common: add += 1 up += new[name] delta.append((new[name], name))

for name in common: d = new.get(name, 0) - old.get(name, 0) if d>0: grow, up = grow+1, up+d if d<0: shrink, down = shrink+1, down-d delta.append((d, name))

delta.sort() delta.reverse()

print "add/remove: %s/%s grow/shrink: %s/%s up/down: %s/%s (%s)" %
(add, remove, grow, shrink, up, -down, up-down) print "%-40s %7s %7s %+7s" % ("function", "old", "new", "delta") for d, n in delta: if d: print "%-40s %7s %7s %+7d" % (n, old.get(n,"-"), new.get(n,"-"), d)