forked from ethanchewy/PythonBuddy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathloopviewer.py
More file actions
executable file
·88 lines (77 loc) · 3.08 KB
/
loopviewer.py
File metadata and controls
executable file
·88 lines (77 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env python
"""
Parse and display the traces produced by pypy-c-jit when PYPYLOG is set.
"""
import sys
import optparse
from rpython.tool import logparser
from rpython.jit.tool.oparser import parse
def main(loopfile, options):
print 'Loading file:'
log = logparser.parse_log_file(loopfile)
loops, summary = consider_category(log, options, "jit-log-opt-")
if not options.quiet:
for loop in loops:
loop.show()
if options.summary:
print
print 'Summary:'
print_summary(summary)
if options.diff:
# non-optimized loops and summary
nloops, nsummary = consider_category(log, options, "jit-log-noopt-")
print
print 'Summary of optimized-away operations'
print
diff = {}
keys = set(summary.keys()).union(set(nsummary))
for key in keys:
before = nsummary.get(key, 0)
after = summary.get(key, 0)
diff[key] = (before-after, before, after)
print_diff(diff)
def consider_category(log, options, category):
loops = logparser.extract_category(log, category)
if options.loopnum is None:
input_loops = loops
else:
input_loops = [loops[options.loopnum]]
loops = [parse(inp, no_namespace=True, nonstrict=True)
for inp in input_loops]
summary = {}
for loop in loops:
summary = loop.summary(summary)
return loops, summary
def print_summary(summary):
ops = [(summary[key], key) for key in summary]
ops.sort(reverse=True)
for n, key in ops:
print '%5d' % n, key
def print_diff(diff):
ops = [(d, before, after, key) for key, (d, before, after) in diff.iteritems()]
ops.sort(reverse=True)
tot_before = 0
tot_after = 0
for d, before, after, key in ops:
tot_before += before
tot_after += after
print '%5d - %5d = %5d ' % (before, after, d), key
print '-' * 50
print '%5d - %5d = %5d ' % (tot_before, tot_after, tot_before-tot_after), 'TOTAL'
if __name__ == '__main__':
parser = optparse.OptionParser(usage="%prog loopfile [options]")
parser.add_option('-n', '--loopnum', dest='loopnum', default=-1, metavar='N', type=int,
help='show the loop number N [default: last]')
parser.add_option('-a', '--all', dest='loopnum', action='store_const', const=None,
help='show all loops in the file')
parser.add_option('-s', '--summary', dest='summary', action='store_true', default=False,
help='print a summary of the operations in the loop(s)')
parser.add_option('-d', '--diff', dest='diff', action='store_true', default=False,
help='print the difference between non-optimized and optimized operations in the loop(s)')
parser.add_option('-q', '--quiet', dest='quiet', action='store_true', default=False,
help='do not show the graphical representation of the loop')
options, args = parser.parse_args()
if len(args) != 1:
parser.print_help()
sys.exit(2)
main(args[0], options)