~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/lsprof.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-01-15 03:31:34 UTC
  • mfrom: (2231.1.1 setup.fixes)
  • Revision ID: pqm@pqm.ubuntu.com-20070115033134-6f456e8e9cc87f35
Python 2.5 fixes for win32 installer

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
# I made one modification to profile so that it returns a pair
4
4
# instead of just the Stats object
5
5
 
6
 
import cPickle
7
 
import os
8
6
import sys
9
7
import thread
10
8
import threading
106
104
        """Output profiling data in calltree format (for KCacheGrind)."""
107
105
        _CallTreeFilter(self.data).output(file)
108
106
 
109
 
    def save(self, filename, format=None):
110
 
        """Save profiling data to a file.
111
 
 
112
 
        :param filename: the name of the output file
113
 
        :param format: 'txt' for a text representation;
114
 
            'callgrind' for calltree format;
115
 
            otherwise a pickled Python object. A format of None indicates
116
 
            that the format to use is to be found from the filename. If
117
 
            the name starts with callgrind.out, callgrind format is used
118
 
            otherwise the format is given by the filename extension.
119
 
        """
120
 
        if format is None:
121
 
            if filename.startswith('callgrind.out'):
122
 
                format = "callgrind"
123
 
            else:
124
 
                ext = os.path.splitext(filename)[1]
125
 
                if len(ext) > 1:
126
 
                    format = ext[1:]
127
 
        outfile = open(filename, 'wb')
128
 
        try:
129
 
            if format == "callgrind":
130
 
                self.calltree(outfile)
131
 
            elif format == "txt":
132
 
                self.pprint(file=outfile)
133
 
            else:
134
 
                self.freeze()
135
 
                cPickle.dump(self, outfile, 2)
136
 
        finally:
137
 
            outfile.close()
138
 
 
139
107
 
140
108
class _CallTreeFilter(object):
141
 
    """Converter of a Stats object to input suitable for KCacheGrind.
142
 
 
143
 
    This code is taken from http://ddaa.net/blog/python/lsprof-calltree
144
 
    with the changes made by J.P. Calderone and Itamar applied. Note that
145
 
    isinstance(code, str) needs to be used at times to determine if the code 
146
 
    object is actually an external code object (with a filename, etc.) or
147
 
    a Python built-in.
148
 
    """
149
109
 
150
110
    def __init__(self, data):
151
111
        self.data = data
170
130
        code = entry.code
171
131
        inlinetime = int(entry.inlinetime * 1000)
172
132
        #print >> out_file, 'ob=%s' % (code.co_filename,)
173
 
        if isinstance(code, str):
174
 
            print >> out_file, 'fi=~'
175
 
        else:
176
 
            print >> out_file, 'fi=%s' % (code.co_filename,)
 
133
        print >> out_file, 'fi=%s' % (code.co_filename,)
177
134
        print >> out_file, 'fn=%s' % (label(code, True),)
178
 
        if isinstance(code, str):
179
 
            print >> out_file, '0 ', inlinetime
180
 
        else:
181
 
            print >> out_file, '%d %d' % (code.co_firstlineno, inlinetime)
 
135
        print >> out_file, '%d %d' % (code.co_firstlineno, inlinetime)
182
136
        # recursive calls are counted in entry.calls
183
137
        if entry.calls:
184
138
            calls = entry.calls
185
139
        else:
186
140
            calls = []
187
 
        if isinstance(code, str):
188
 
            lineno = 0
189
 
        else:
190
 
            lineno = code.co_firstlineno
191
141
        for subentry in calls:
192
 
            self._subentry(lineno, subentry)
 
142
            self._subentry(code.co_firstlineno, subentry)
193
143
        print >> out_file
194
144
 
195
145
    def _subentry(self, lineno, subentry):
198
148
        totaltime = int(subentry.totaltime * 1000)
199
149
        #print >> out_file, 'cob=%s' % (code.co_filename,)
200
150
        print >> out_file, 'cfn=%s' % (label(code, True),)
201
 
        if isinstance(code, str):
202
 
            print >> out_file, 'cfi=~'
203
 
            print >> out_file, 'calls=%d 0' % (subentry.callcount,)
204
 
        else:
205
 
            print >> out_file, 'cfi=%s' % (code.co_filename,)
206
 
            print >> out_file, 'calls=%d %d' % (
207
 
                subentry.callcount, code.co_firstlineno)
 
151
        print >> out_file, 'cfi=%s' % (code.co_filename,)
 
152
        print >> out_file, 'calls=%d %d' % (
 
153
            subentry.callcount, code.co_firstlineno)
208
154
        print >> out_file, '%d %d' % (lineno, totaltime)
209
155
 
 
156
 
210
157
_fn2mod = {}
211
158
 
212
159
def label(code, calltree=False):