##// END OF EJS Templates
py3: use write() instead of print()...
Gregory Szorc -
r40230:1ae0faa1 default
parent child Browse files
Show More
@@ -1,86 +1,88 b''
1 """
1 """
2 lsprofcalltree.py - lsprof output which is readable by kcachegrind
2 lsprofcalltree.py - lsprof output which is readable by kcachegrind
3
3
4 Authors:
4 Authors:
5 * David Allouche <david <at> allouche.net>
5 * David Allouche <david <at> allouche.net>
6 * Jp Calderone & Itamar Shtull-Trauring
6 * Jp Calderone & Itamar Shtull-Trauring
7 * Johan Dahlin
7 * Johan Dahlin
8
8
9 This software may be used and distributed according to the terms
9 This software may be used and distributed according to the terms
10 of the GNU General Public License, incorporated herein by reference.
10 of the GNU General Public License, incorporated herein by reference.
11 """
11 """
12
12
13 from __future__ import absolute_import, print_function
13 from __future__ import absolute_import
14
14
15 def label(code):
15 def label(code):
16 if isinstance(code, str):
16 if isinstance(code, str):
17 return '~' + code # built-in functions ('~' sorts at the end)
17 return '~' + code # built-in functions ('~' sorts at the end)
18 else:
18 else:
19 return '%s %s:%d' % (code.co_name,
19 return '%s %s:%d' % (code.co_name,
20 code.co_filename,
20 code.co_filename,
21 code.co_firstlineno)
21 code.co_firstlineno)
22
22
23 class KCacheGrind(object):
23 class KCacheGrind(object):
24 def __init__(self, profiler):
24 def __init__(self, profiler):
25 self.data = profiler.getstats()
25 self.data = profiler.getstats()
26 self.out_file = None
26 self.out_file = None
27
27
28 def output(self, out_file):
28 def output(self, out_file):
29 self.out_file = out_file
29 self.out_file = out_file
30 print('events: Ticks', file=out_file)
30 out_file.write(b'events: Ticks\n')
31 self._print_summary()
31 self._print_summary()
32 for entry in self.data:
32 for entry in self.data:
33 self._entry(entry)
33 self._entry(entry)
34
34
35 def _print_summary(self):
35 def _print_summary(self):
36 max_cost = 0
36 max_cost = 0
37 for entry in self.data:
37 for entry in self.data:
38 totaltime = int(entry.totaltime * 1000)
38 totaltime = int(entry.totaltime * 1000)
39 max_cost = max(max_cost, totaltime)
39 max_cost = max(max_cost, totaltime)
40 print('summary: %d' % max_cost, file=self.out_file)
40 self.out_file.write(b'summary: %d\n' % max_cost)
41
41
42 def _entry(self, entry):
42 def _entry(self, entry):
43 out_file = self.out_file
43 out_file = self.out_file
44
44
45 code = entry.code
45 code = entry.code
46 if isinstance(code, str):
46 if isinstance(code, str):
47 print('fi=~', file=out_file)
47 out_file.write(b'fi=~\n')
48 else:
48 else:
49 print('fi=%s' % code.co_filename, file=out_file)
49 out_file.write(b'fi=%s\n' % code.co_filename)
50 print('fn=%s' % label(code), file=out_file)
50
51 out_file.write(b'fn=%s\n' % label(code))
51
52
52 inlinetime = int(entry.inlinetime * 1000)
53 inlinetime = int(entry.inlinetime * 1000)
53 if isinstance(code, str):
54 if isinstance(code, str):
54 print('0 ', inlinetime, file=out_file)
55 out_file.write(b'0 %d\n' % inlinetime)
55 else:
56 else:
56 print('%d %d' % (code.co_firstlineno, inlinetime), file=out_file)
57 out_file.write(b'%d %d\n' % (code.co_firstlineno, inlinetime))
57
58
58 # recursive calls are counted in entry.calls
59 # recursive calls are counted in entry.calls
59 if entry.calls:
60 if entry.calls:
60 calls = entry.calls
61 calls = entry.calls
61 else:
62 else:
62 calls = []
63 calls = []
63
64
64 if isinstance(code, str):
65 if isinstance(code, str):
65 lineno = 0
66 lineno = 0
66 else:
67 else:
67 lineno = code.co_firstlineno
68 lineno = code.co_firstlineno
68
69
69 for subentry in calls:
70 for subentry in calls:
70 self._subentry(lineno, subentry)
71 self._subentry(lineno, subentry)
71 print(file=out_file)
72
73 out_file.write(b'\n')
72
74
73 def _subentry(self, lineno, subentry):
75 def _subentry(self, lineno, subentry):
74 out_file = self.out_file
76 out_file = self.out_file
75 code = subentry.code
77 code = subentry.code
76 print('cfn=%s' % label(code), file=out_file)
78 out_file.write(b'cfn=%s\n' % label(code))
77 if isinstance(code, str):
79 if isinstance(code, str):
78 print('cfi=~', file=out_file)
80 out_file.write(b'cfi=~\n')
79 print('calls=%d 0' % subentry.callcount, file=out_file)
81 out_file.write(b'calls=%d 0\n' % subentry.callcount)
80 else:
82 else:
81 print('cfi=%s' % code.co_filename, file=out_file)
83 out_file.write(b'cfi=%s\n' % code.co_filename)
82 print('calls=%d %d' % (
84 out_file.write(b'calls=%d %d\n' % (
83 subentry.callcount, code.co_firstlineno), file=out_file)
85 subentry.callcount, code.co_firstlineno))
84
86
85 totaltime = int(subentry.totaltime * 1000)
87 totaltime = int(subentry.totaltime * 1000)
86 print('%d %d' % (lineno, totaltime), file=out_file)
88 out_file.write(b'%d %d\n' % (lineno, totaltime))
General Comments 0
You need to be logged in to leave comments. Login now