linux-yocto/scripts/bloat-o-meter
Alexey Dobriyan 0d7bbb4364 scripts/bloat-o-meter: compile .NUMBER regex
Every often used regex is better be compiled in Python.

Speedup is about ~9.8% (whee!)

    $ perf stat -r 16 taskset -c 15 ./scripts/bloat-o-meter ../vmlinux-000 ../obj/vmlinux >/dev/null
    7.091202853 seconds time elapsed                         ( +-  0.15% )

    +re.compile
    6.397564973 seconds time elapsed                         ( +-  0.34% )

Link: http://lkml.kernel.org/r/20161119004417.GB1200@avx2
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2016-12-12 18:55:06 -08:00

2.2 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)

re_NUMBER = re.compile(r'.[0-9]+')

def getsizes(file): sym = {} with os.popen("nm --size-sort " + file) as f: for line in f: size, type, name = line.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_NUMBER.sub('', 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))