[pypy-svn] r68771 - pypy/branch/gc-dump-heap/pypy/tool

fijal at codespeak.net fijal at codespeak.net
Mon Oct 26 21:26:40 CET 2009


Author: fijal
Date: Mon Oct 26 21:26:38 2009
New Revision: 68771

Added:
   pypy/branch/gc-dump-heap/pypy/tool/gcdump.py   (contents, props changed)
Log:
A tool to create kcachegrind compatible output


Added: pypy/branch/gc-dump-heap/pypy/tool/gcdump.py
==============================================================================
--- (empty file)
+++ pypy/branch/gc-dump-heap/pypy/tool/gcdump.py	Mon Oct 26 21:26:38 2009
@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+""" Usage: gcdump.py gcdump typeids [outfile]
+"""
+
+from __future__ import division
+import re
+import sys
+
+class GcDump(object):
+    def __init__(self, count, size, links):
+        self.count  = count
+        self.size   = size
+        self.links  = links
+
+def read_gcdump(f):
+    lines = f.readlines()
+    r = [None] * len(lines)
+    for i, line in enumerate(lines):
+        count, size, rest = line.split(" ")
+        r[i] = GcDump(int(count), int(size),
+                      [int(j) for j in rest.split(",")])
+    return r
+
+def read_typeids(f):
+    res = []
+    for line in f.readlines():
+        member, name = re.split("\s+", line, 1)
+        assert member == "member%d" % len(res)
+        res.append(name.strip("\n"))
+    return res
+
+def getname(name, _cache = {}):
+    try:
+        return _cache[name]
+    except KeyError:
+        no = len(_cache)
+        _cache[name] = '(%d)' % len(_cache)
+        return '(%d) %s' % (no, name)
+
+def process(f, gcdump, typeids):
+    f.write("events: B\n\n")
+    for tid, name in enumerate(typeids):
+        if not tid % 100:
+            sys.stderr.write("%d%%.." % (tid / len(typeids) * 100))
+        f.write("fn=%s\n" % getname(name))
+        f.write("0 %d\n" % (gcdump[tid].count * gcdump[tid].size))
+        for subtid, no in enumerate(gcdump[tid].links):
+            if no != 0:
+                f.write("cfn=%s\n" % getname(typeids[subtid]))
+                f.write("calls=0 %d\n" % no)
+                f.write("0 %d\n" % (gcdump[subtid].count * gcdump[subtid].size))
+        f.write("\n")
+    sys.stderr.write("100%\n")
+
+def main(gcdump_f, typeids_f, outfile):
+    gcdump = read_gcdump(gcdump_f)
+    gcdump_f.close()
+    typeids = read_typeids(typeids_f)
+    typeids_f.close()
+    process(outfile, gcdump, typeids)
+
+if __name__ == '__main__':
+    if len(sys.argv) == 4:
+        outfile = open(sys.argv[3], "w")
+    elif len(sys.argv) == 3:
+        outfile = sys.stdout
+    else:
+        print __doc__
+        sys.exit(1)
+    gcdump = open(sys.argv[1])
+    typeids = open(sys.argv[2])
+    main(gcdump, typeids, outfile)
+    if len(sys.argv) == 4:
+        outfile.close()



More information about the Pypy-commit mailing list