Mercurial > kallithea
view rhodecode/lib/profiler.py @ 3774:60335b702a00 beta
invalidation: don't create CacheInvalidation records on startup
Creating the records early gave an advantage before lightweight was introduced.
With lightweight it is no longer necessary.
The records will be created on demand anyway and there is no reason to create and
maintain them before they are used.
author | Mads Kiilerich <madski@unity3d.com> |
---|---|
date | Wed, 03 Apr 2013 15:56:12 +0200 |
parents | 2c2bdaeca912 |
children |
line wrap: on
line source
from __future__ import with_statement import gc import objgraph import cProfile import pstats import cgi import pprint import threading from StringIO import StringIO class ProfilingMiddleware(object): def __init__(self, app): self.lock = threading.Lock() self.app = app def __call__(self, environ, start_response): with self.lock: profiler = cProfile.Profile() def run_app(*a, **kw): self.response = self.app(environ, start_response) profiler.runcall(run_app, environ, start_response) profiler.snapshot_stats() stats = pstats.Stats(profiler) stats.sort_stats('calls') #cummulative # Redirect output out = StringIO() stats.stream = out stats.print_stats() resp = ''.join(self.response) # Lets at least only put this on html-like responses. if resp.strip().startswith('<'): ## The profiling info is just appended to the response. ## Browsers don't mind this. resp += ('<pre style="text-align:left; ' 'border-top: 4px dashed red; padding: 1em;">') resp += cgi.escape(out.getvalue(), True) ct = objgraph.show_most_common_types() print ct resp += ct if ct else '---' output = StringIO() pprint.pprint(environ, output, depth=3) resp += cgi.escape(output.getvalue(), True) resp += '</pre>' return resp