Fix piping output to a program which quickly exits (read: head -n1) $ ./scripts/bloat-o-meter ../vmlinux-000 ../obj/vmlinux | head -n1 add/remove: 0/0 grow/shrink: 9/60 up/down: 124/-305 (-181) close failed in file object destructor: sys.excepthook is missing lost sys.stderr Link: http://lkml.kernel.org/r/20161028204618.GA29923@avx2 Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> Cc: Matt Mackall <mpm@selenic.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2.1 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 from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE, SIG_DFL)
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.startswith("mod"): continue if name.startswith("SyS"): continue if name.startswith("compat_SyS_"): continue if name == "linux_banner": continue # statics and some other optimizations adds random .NUMBER name = re.sub(r'.[0-9]+', '', name) 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 = [], {} otot, ntot = 0, 0
for a in old: if a in new: common[a] = 1
for name in old: otot += old[name] if name not in common: remove += 1 down += old[name] delta.append((-old[name], name))
for name in new: ntot += new[name] 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))
print("Total: Before=%d, After=%d, chg %+.2f%%" %
(otot, ntot, (ntot - otot)*100.0/otot))