[pypy-svn] r25041 - pypy/dist/pypy/translator/backendopt

cfbolz at codespeak.net cfbolz at codespeak.net
Mon Mar 27 17:03:42 CEST 2006


Author: cfbolz
Date: Mon Mar 27 17:03:40 2006
New Revision: 25041

Modified:
   pypy/dist/pypy/translator/backendopt/all.py
   pypy/dist/pypy/translator/backendopt/stat.py
Log:
(cfbolz, pedronis): add statistics per graph (sorted by hash of bytecode to
make it more diffable)


Modified: pypy/dist/pypy/translator/backendopt/all.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/all.py	(original)
+++ pypy/dist/pypy/translator/backendopt/all.py	Mon Mar 27 17:03:40 2006
@@ -22,7 +22,7 @@
 
     if PRINT_STATISTICS:
         print "before optimizations:"
-        print_statistics(translator.graphs[0], translator)
+        print_statistics(translator.graphs[0], translator, "per-graph.txt")
 
     if raisingop2direct_call_all:
         raisingop2direct_call(translator)

Modified: pypy/dist/pypy/translator/backendopt/stat.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/stat.py	(original)
+++ pypy/dist/pypy/translator/backendopt/stat.py	Mon Mar 27 17:03:40 2006
@@ -1,17 +1,21 @@
 from pypy.translator.simplify import get_graph
+import md5
 
-def get_statistics(graph, translator):
+def get_statistics(graph, translator, save_per_graph_details=None):
     seen_graphs = {}
     stack = [graph]
     num_graphs = 0
     num_blocks = 0
     num_ops = 0
+    per_graph = {}
     while stack:
         graph = stack.pop()
         if graph in seen_graphs:
             continue
         seen_graphs[graph] = True
         num_graphs += 1
+        old_num_blocks = num_blocks
+        old_num_ops = num_ops
         for block in graph.iterblocks():
             num_blocks += 1
             for op in block.operations:
@@ -24,10 +28,27 @@
                     if called_graphs is not None:
                         stack.extend(called_graphs)
                 num_ops += 1
+        per_graph[graph] = (num_blocks-old_num_blocks, num_ops-old_num_ops)
+    if save_per_graph_details:
+        details = []
+        for graph, (nblocks, nops) in per_graph.iteritems():
+            try:
+                code = graph.func.func_code.co_code
+            except AttributeError:
+                code = "None"
+            hash = md5.new(code).hexdigest()
+            details.append((hash, graph.name, nblocks, nops))
+        details.sort()
+        f = open(save_per_graph_details, "w")
+        try:
+            for hash, name, nblocks, nops in details:
+                print >>f, hash, name, nblocks, nops
+        finally:
+            f.close()
     return num_graphs, num_blocks, num_ops
 
-def print_statistics(graph, translator):
-    num_graphs, num_blocks, num_ops = get_statistics(graph, translator)
+def print_statistics(graph, translator, save_per_graph_details=None):
+    num_graphs, num_blocks, num_ops = get_statistics(graph, translator, save_per_graph_details)
     print ("Statistics:\nnumber of graphs %s\n"
            "number of blocks %s\n"
            "number of operations %s\n") % (num_graphs, num_blocks, num_ops)



More information about the Pypy-commit mailing list