mercurial/lsprof.py
changeset 43076 2372284d9457
parent 40202 56ea22fa55f0
child 43077 687b865b95ad
equal deleted inserted replaced
43075:57875cf423c9 43076:2372284d9457
     7 
     7 
     8 # PyPy doesn't expose profiler_entry from the module.
     8 # PyPy doesn't expose profiler_entry from the module.
     9 profiler_entry = getattr(_lsprof, 'profiler_entry', None)
     9 profiler_entry = getattr(_lsprof, 'profiler_entry', None)
    10 
    10 
    11 __all__ = ['profile', 'Stats']
    11 __all__ = ['profile', 'Stats']
       
    12 
    12 
    13 
    13 def profile(f, *args, **kwds):
    14 def profile(f, *args, **kwds):
    14     """XXX docstring"""
    15     """XXX docstring"""
    15     p = Profiler()
    16     p = Profiler()
    16     p.enable(subcalls=True, builtins=True)
    17     p.enable(subcalls=True, builtins=True)
    48         d = self.data
    49         d = self.data
    49         if top is not None:
    50         if top is not None:
    50             d = d[:top]
    51             d = d[:top]
    51         cols = "% 12d %12d %11.4f %11.4f   %s\n"
    52         cols = "% 12d %12d %11.4f %11.4f   %s\n"
    52         hcols = "% 12s %12s %12s %12s %s\n"
    53         hcols = "% 12s %12s %12s %12s %s\n"
    53         file.write(hcols % ("CallCount", "Recursive", "Total(s)",
    54         file.write(
    54                             "Inline(s)", "module:lineno(function)"))
    55             hcols
       
    56             % (
       
    57                 "CallCount",
       
    58                 "Recursive",
       
    59                 "Total(s)",
       
    60                 "Inline(s)",
       
    61                 "module:lineno(function)",
       
    62             )
       
    63         )
    55         count = 0
    64         count = 0
    56         for e in d:
    65         for e in d:
    57             file.write(cols % (e.callcount, e.reccallcount, e.totaltime,
    66             file.write(
    58                                e.inlinetime, label(e.code)))
    67                 cols
       
    68                 % (
       
    69                     e.callcount,
       
    70                     e.reccallcount,
       
    71                     e.totaltime,
       
    72                     e.inlinetime,
       
    73                     label(e.code),
       
    74                 )
       
    75             )
    59             count += 1
    76             count += 1
    60             if limit is not None and count == limit:
    77             if limit is not None and count == limit:
    61                 return
    78                 return
    62             ccount = 0
    79             ccount = 0
    63             if climit and e.calls:
    80             if climit and e.calls:
    64                 for se in e.calls:
    81                 for se in e.calls:
    65                     file.write(cols % (se.callcount, se.reccallcount,
    82                     file.write(
    66                                        se.totaltime, se.inlinetime,
    83                         cols
    67                                        "    %s" % label(se.code)))
    84                         % (
       
    85                             se.callcount,
       
    86                             se.reccallcount,
       
    87                             se.totaltime,
       
    88                             se.inlinetime,
       
    89                             "    %s" % label(se.code),
       
    90                         )
       
    91                     )
    68                     count += 1
    92                     count += 1
    69                     ccount += 1
    93                     ccount += 1
    70                     if limit is not None and count == limit:
    94                     if limit is not None and count == limit:
    71                         return
    95                         return
    72                     if climit is not None and ccount == climit:
    96                     if climit is not None and ccount == climit:
    85                 for j in range(len(e.calls)):
   109                 for j in range(len(e.calls)):
    86                     se = e.calls[j]
   110                     se = e.calls[j]
    87                     if not isinstance(se.code, str):
   111                     if not isinstance(se.code, str):
    88                         e.calls[j] = type(se)((label(se.code),) + se[1:])
   112                         e.calls[j] = type(se)((label(se.code),) + se[1:])
    89 
   113 
       
   114 
    90 _fn2mod = {}
   115 _fn2mod = {}
       
   116 
    91 
   117 
    92 def label(code):
   118 def label(code):
    93     if isinstance(code, str):
   119     if isinstance(code, str):
    94         if sys.version_info.major >= 3:
   120         if sys.version_info.major >= 3:
    95             code = code.encode('latin-1')
   121             code = code.encode('latin-1')
   113     if sys.version_info.major >= 3:
   139     if sys.version_info.major >= 3:
   114         res = res.encode('latin-1')
   140         res = res.encode('latin-1')
   115 
   141 
   116     return res
   142     return res
   117 
   143 
       
   144 
   118 if __name__ == '__main__':
   145 if __name__ == '__main__':
   119     import os
   146     import os
       
   147 
   120     sys.argv = sys.argv[1:]
   148     sys.argv = sys.argv[1:]
   121     if not sys.argv:
   149     if not sys.argv:
   122         print("usage: lsprof.py <script> <arguments...>", file=sys.stderr)
   150         print("usage: lsprof.py <script> <arguments...>", file=sys.stderr)
   123         sys.exit(2)
   151         sys.exit(2)
   124     sys.path.insert(0, os.path.abspath(os.path.dirname(sys.argv[0])))
   152     sys.path.insert(0, os.path.abspath(os.path.dirname(sys.argv[0])))