Skip to content

Instantly share code, notes, and snippets.

@spin6lock
Last active October 14, 2015 01:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save spin6lock/4284242 to your computer and use it in GitHub Desktop.
Save spin6lock/4284242 to your computer and use it in GitHub Desktop.
a simple tool to gen report from two OBJ_DUMP snapshot
#encoding:utf8
def analyze(filename):
statics = {}
with open(filename) as fh:
for line in fh:
infos = line.split()
obj_name, obj_size, _, refs = infos[0:4]
statics[obj_name] = [int(refs), int(obj_size)]
return statics
def gen_diff(staticsA, staticsB):
diff = {}
new = {}
for obj_name, recordB in staticsB.iteritems():
if not staticsA.has_key(obj_name):
new[obj_name] = recordB
continue
recordA = staticsA[obj_name]
if recordB != recordA:
diff[obj_name] = [recordB[0] - recordA[0], recordB[1] - recordA[1]]
return diff, new
def gen_ref_report(diff):
for obj_name in sorted(diff.iterkeys()):
record = diff[obj_name]
ref, size = record
if (ref > 0):
print "obj ", obj_name, "amount increase:", str(ref)
def gen_size_report(diff):
for obj_name in sorted(diff.iterkeys()):
record = diff[obj_name]
ref, size = record
if (size > 0):
print "obj ", obj_name, "size increase:", str(size)
def gen_new_report(new):
for obj_name in sorted(new.iterkeys()):
record = new[obj_name]
print "new obj:", obj_name, " ref:", record[0], " size:", record[1]
def print_time_diff(filename1, filename2):
import os.path, datetime
timestamp1 = os.path.getmtime(filename1)
timestamp2 = os.path.getmtime(filename2)
delta = datetime.timedelta(seconds = (timestamp2 - timestamp1))
print "=" * 10, "In", delta, "=" * 10
def main(filename1, filename2):
print_time_diff(filename1, filename2)
staticsA = analyze(filename1)
staticsB = analyze(filename2)
diff, new = gen_diff(staticsA, staticsB)
gen_ref_report(diff)
gen_size_report(diff)
gen_new_report(new)
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="gen diff from two obj_dump file")
parser.add_argument("pathA", metavar="PATHA", type=str)
parser.add_argument("pathB", metavar="PATHB", type=str)
args = parser.parse_args()
main(args.pathA, args.pathB)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment