[pypy-svn] r76808 - in pypy/trunk/pypy/jit/tool: . test
fijal at codespeak.net
fijal at codespeak.net
Mon Aug 30 19:25:29 CEST 2010
Author: fijal
Date: Mon Aug 30 19:25:27 2010
New Revision: 76808
Modified:
pypy/trunk/pypy/jit/tool/test/test_traceviewer.py
pypy/trunk/pypy/jit/tool/traceviewer.py
Log:
Add to traceviewer an option (--use-threshold) that will display only top 20
traces as colored
Modified: pypy/trunk/pypy/jit/tool/test/test_traceviewer.py
==============================================================================
--- pypy/trunk/pypy/jit/tool/test/test_traceviewer.py (original)
+++ pypy/trunk/pypy/jit/tool/test/test_traceviewer.py Mon Aug 30 19:25:27 2010
@@ -52,10 +52,10 @@
def test_postparse(self):
real_loops = [FinalBlock("debug_merge_point('<code object _runCallbacks, file '/tmp/x/twisted-trunk/twisted/internet/defer.py', line 357> #40 POP_TOP')", None)]
- postprocess(real_loops, real_loops[:])
+ postprocess(real_loops, real_loops[:], {})
assert real_loops[0].header.startswith("_runCallbacks, file '/tmp/x/twisted-trunk/twisted/internet/defer.py', line 357")
def test_load_actual(self):
fname = py.path.local(__file__).join('..', 'data.log.bz2')
- main(str(fname), view=False)
+ main(str(fname), False, view=False)
# assert did not explode
Modified: pypy/trunk/pypy/jit/tool/traceviewer.py
==============================================================================
--- pypy/trunk/pypy/jit/tool/traceviewer.py (original)
+++ pypy/trunk/pypy/jit/tool/traceviewer.py Mon Aug 30 19:25:27 2010
@@ -1,11 +1,12 @@
#!/usr/bin/env python
-""" Usage: traceviewer.py loopfile
+""" Usage: traceviewer.py [--use-threshold] loopfile
"""
import optparse
import sys
import re
import math
+import py
import autopath
from pypy.translator.tool.graphpage import GraphPage
@@ -33,6 +34,7 @@
dotgen.emit_edge('node%d' % (counter - 1), 'node%d' % counter)
counter += 1
lines_so_far = []
+ print line
lines_so_far.append(line)
dotgen.emit_node('node%d' % counter, shape="box",
label="\n".join(lines_so_far))
@@ -40,13 +42,13 @@
self.source = dotgen.generate(target=None)
class Page(GraphPage):
- def compute(self, graphs):
+ def compute(self, graphs, counts):
dotgen = DotGen('trace')
self.loops = graphs
self.links = {}
self.cache = {}
for loop in self.loops:
- loop.generate(dotgen)
+ loop.generate(dotgen, counts)
loop.getlinks(self.links)
self.cache["loop" + str(loop.no)] = loop
self.source = dotgen.generate(target=None)
@@ -71,9 +73,14 @@
def getlinks(self, links):
links[self.linksource] = self.name()
- def generate(self, dotgen):
+ def generate(self, dotgen, counts):
+ val = counts.get(self.key, 0)
+ if val > counts.threshold:
+ fillcolor = get_gradient_color(self.ratio)
+ else:
+ fillcolor = "white"
dotgen.emit_node(self.name(), label=self.header,
- shape='box', fillcolor=get_gradient_color(self.ratio))
+ shape='box', fillcolor=fillcolor)
def get_content(self):
return self._content
@@ -113,11 +120,11 @@
self.target = target
BasicBlock.__init__(self, content)
- def postprocess(self, loops, memo):
- postprocess_loop(self.target, loops, memo)
+ def postprocess(self, loops, memo, counts):
+ postprocess_loop(self.target, loops, memo, counts)
- def generate(self, dotgen):
- BasicBlock.generate(self, dotgen)
+ def generate(self, dotgen, counts):
+ BasicBlock.generate(self, dotgen, counts)
if self.target is not None:
dotgen.emit_edge(self.name(), self.target.name())
@@ -127,12 +134,12 @@
self.right = right
BasicBlock.__init__(self, content)
- def postprocess(self, loops, memo):
- postprocess_loop(self.left, loops, memo)
- postprocess_loop(self.right, loops, memo)
+ def postprocess(self, loops, memo, counts):
+ postprocess_loop(self.left, loops, memo, counts)
+ postprocess_loop(self.right, loops, memo, counts)
- def generate(self, dotgen):
- BasicBlock.generate(self, dotgen)
+ def generate(self, dotgen, counts):
+ BasicBlock.generate(self, dotgen, counts)
dotgen.emit_edge(self.name(), self.left.name())
dotgen.emit_edge(self.name(), self.right.name())
@@ -176,13 +183,11 @@
real_loops = []
counter = 1
bar = progressbar.ProgressBar(color='blue')
- single_percent = len(loops) / 100
allloops = []
- for i, loop in enumerate(loops):
+ for i, loop in enumerate(loops):
if i > MAX_LOOPS:
return real_loops, allloops
- if single_percent and i % single_percent == 0:
- bar.render(i / single_percent)
+ bar.render((i * 100) / len(loops))
firstline = loop[:loop.find("\n")]
m = re.match('# Loop (\d+)', firstline)
if m:
@@ -202,17 +207,19 @@
counter += loop.count("\n") + 2
return real_loops, allloops
-def postprocess_loop(loop, loops, memo):
+def postprocess_loop(loop, loops, memo, counts):
if loop in memo:
return
memo.add(loop)
if loop is None:
return
- m = re.search("debug_merge_point\('<code object (.*?)> (.*?)'", loop.content)
+ m = re.search("debug_merge_point\('(<code object (.*?)> (.*?))'", loop.content)
if m is None:
name = '?'
+ loop.key = '?'
else:
- name = m.group(1) + " " + m.group(2)
+ name = m.group(2) + " " + m.group(3)
+ loop.key = m.group(1)
opsno = loop.content.count("\n")
lastline = loop.content[loop.content.rfind("\n", 0, len(loop.content) - 2):]
m = re.search('descr=<Loop(\d+)', lastline)
@@ -221,8 +228,8 @@
loop.target = loops[int(m.group(1))]
bcodes = loop.content.count('debug_merge_point')
loop.linksource = "loop" + str(loop.no)
- loop.header = "%s loop%d\n%d operations\n%d opcodes" % (name, loop.no, opsno,
- bcodes)
+ loop.header = ("%s loop%d\nrun %s times\n%d operations\n%d opcodes" %
+ (name, loop.no, counts.get(loop.key, '?'), opsno, bcodes))
loop.header += "\n" * (opsno / 100)
if bcodes == 0:
loop.ratio = opsno
@@ -230,29 +237,47 @@
loop.ratio = float(opsno) / bcodes
content = loop.content
loop.content = "Logfile at %d\n" % loop.startlineno + content
- loop.postprocess(loops, memo)
-
-def postprocess(loops, allloops):
+ loop.postprocess(loops, memo, counts)
+
+def postprocess(loops, allloops, counts):
for loop in allloops:
if isinstance(loop, Block):
loop.left = allloops[loop.left]
loop.right = allloops[loop.right]
memo = set()
for loop in loops:
- postprocess_loop(loop, loops, memo)
+ postprocess_loop(loop, loops, memo, counts)
+
+class Counts(dict):
+ pass
-def main(loopfile, view=True):
+def main(loopfile, options, view=True):
+ countname = py.path.local(loopfile + '.count')
+ if countname.check():
+ counts = [line.rsplit(':', 1) for line in countname.readlines()]
+ counts = Counts([(k, int(v.strip('\n'))) for k, v in counts])
+ l = list(sorted(counts.values()))
+ if len(l) > 20 and options.use_threshold:
+ counts.threshold = l[-20]
+ else:
+ counts.threshold = 0
+ for_print = [(v, k) for k, v in counts.iteritems()]
+ for_print.sort()
+ else:
+ counts = {}
log = logparser.parse_log_file(loopfile)
loops = logparser.extract_category(log, "jit-log-opt-")
real_loops, allloops = splitloops(loops)
- postprocess(real_loops, allloops)
+ postprocess(real_loops, allloops, counts)
if view:
- Page(allloops).display()
+ Page(allloops, counts).display()
if __name__ == '__main__':
parser = optparse.OptionParser(usage=__doc__)
+ parser.add_option('--use-threshold', dest='use_threshold',
+ action="store_true")
options, args = parser.parse_args(sys.argv)
if len(args) != 2:
print __doc__
sys.exit(1)
- main(args[1])
+ main(args[1], options.use_threshold)
More information about the Pypy-commit
mailing list