linux/scripts/bloat-o-meter
Vineet Gupta b21e91c305 scripts/bloat-o-meter: print percent change
This adds an additional line of output (to reduce the chances of
breaking any existing output parsers) which prints the total size before
and after and the relative difference.

  add/remove: 39/0 grow/shrink: 12408/55 up/down: 362227/-1430 (360797)
  function                                     old     new   delta
  ext4_fill_super                            10556   12590   +2034
  _fpadd_parts                                   -    1186   +1186
  ntfs_fill_super                             5340    6164    +824
  ...
  ...
  __divdf3                                     752     386    -366
  unlzma                                      3682    3274    -408
  Total: Before=5023101, After=5383898, chg 7.000000%
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Link: http://lkml.kernel.org/r/1463124110-30314-1-git-send-email-vgupta@synopsys.com
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Michal Marek <mmarek@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2016-05-19 19:12:14 -07:00

72 lines
2.1 KiB
Python
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.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 %f%%" % \
(otot, ntot, (ntot - otot)*100/otot))