~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to profile_imports.py

  • Committer: Martin Pool
  • Date: 2010-02-23 07:43:11 UTC
  • mfrom: (4797.2.20 2.1)
  • mto: This revision was merged to the branch mainline in revision 5055.
  • Revision ID: mbp@sourcefrog.net-20100223074311-gnj55xdhrgz9l94e
Merge 2.1 back to trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 by Canonical Ltd
 
1
# Copyright (C) 2006, 2008, 2009, 2010 by Canonical Ltd
2
2
# Written by John Arbash Meinel <john@arbash-meinel.com>
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
17
17
 
18
18
"""A custom importer and regex compiler which logs time spent."""
19
19
 
20
 
import sre
21
20
import sys
22
21
import time
23
22
 
24
23
 
 
24
if sys.version_info < (2, 5, 0):
 
25
    import sre
 
26
    re = sre
 
27
else:
 
28
    import re
 
29
 
 
30
 
25
31
_parent_stack = []
26
32
_total_stack = {}
27
33
_info = {}
58
64
 
59
65
def log_stack_info(out_file, sorted=True, hide_fast=True):
60
66
    # Find all of the roots with import = 0
61
 
    out_file.write(' cum  inline name\t\t\t\t\t\tframe\n')
 
67
    out_file.write('%5s %5s %-40s @ %s:%s\n'
 
68
        % ('cum', 'inline', 'name', 'file', 'line'))
62
69
    todo = [(value[-1], key) for key,value in _info.iteritems() if value[0] == 0]
63
70
 
64
71
    if sorted:
83
90
 
84
91
        # indent, cum_time, mod_time, name,
85
92
        # scope_name, frame_name, frame_lineno
86
 
        out_file.write('%5.1f %5.1f %s %-35s\t@ %s:%d\n'
87
 
            % (info[-1]*1000., mod_time*1000., '+'*info[0], 
88
 
               cur[1][:35], info[1], info[2]))
 
93
        out_file.write('%5.1f %5.1f %-40s @ %s:%d\n'
 
94
            % (info[-1]*1000., mod_time*1000.,
 
95
               ('+'*info[0] + cur[1]),
 
96
               info[1], info[2]))
89
97
 
90
98
        if sorted:
91
99
            c_times.sort()
96
104
 
97
105
_real_import = __import__
98
106
 
99
 
def timed_import(name, globals, locals, fromlist):
 
107
def timed_import(name, globals=None, locals=None, fromlist=None, level=None):
100
108
    """Wrap around standard importer to log import time"""
 
109
    # normally there are 4, but if this is called as __import__ eg by
 
110
    # /usr/lib/python2.6/email/__init__.py then there may be only one
 
111
    # parameter
 
112
    # level is only passed by python2.6
101
113
 
102
 
    scope_name = globals.get('__name__', None)
103
 
    if scope_name is None:
104
 
        scope_name = globals.get('__file__', None)
105
 
    if scope_name is None:
106
 
        scope_name = globals.keys()
 
114
    if globals is None:
 
115
        # can't determine the scope name afaics; we could peek up the stack to
 
116
        # see where this is being called from, but it should be a rare case.
 
117
        scope_name = None
107
118
    else:
108
 
        # Trim out paths before bzrlib
109
 
        loc = scope_name.find('bzrlib')
110
 
        if loc != -1:
111
 
            scope_name = scope_name[loc:]
112
 
        # For stdlib, trim out early paths
113
 
        loc = scope_name.find('python2.4')
114
 
        if loc != -1:
115
 
            scope_name = scope_name[loc:]
 
119
        scope_name = globals.get('__name__', None)
 
120
        if scope_name is None:
 
121
            scope_name = globals.get('__file__', None)
 
122
        if scope_name is None:
 
123
            scope_name = globals.keys()
 
124
        else:
 
125
            # Trim out paths before bzrlib
 
126
            loc = scope_name.find('bzrlib')
 
127
            if loc != -1:
 
128
                scope_name = scope_name[loc:]
 
129
            # For stdlib, trim out early paths
 
130
            loc = scope_name.find('python2.4')
 
131
            if loc != -1:
 
132
                scope_name = scope_name[loc:]
116
133
 
117
134
    # Figure out the frame that is doing the importing
118
135
    frame = sys._getframe(1)
145
162
    return mod
146
163
 
147
164
 
148
 
_real_compile = sre._compile
 
165
_real_compile = re._compile
 
166
 
149
167
 
150
168
def timed_compile(*args, **kwargs):
151
169
    """Log how long it takes to compile a regex"""
177
195
def install():
178
196
    """Install the hooks for measuring import and regex compile time."""
179
197
    __builtins__['__import__'] = timed_import
180
 
    sre._compile = timed_compile
 
198
    re._compile = timed_compile
181
199
 
182
200
 
183
201
def uninstall():
184
202
    """Remove the import and regex compile timing hooks."""
185
203
    __builtins__['__import__'] = _real_import
186
 
    sre._compile = _real_compile
 
204
    re._compile = _real_compile
187
205