ho trovato Gprof2Dot estremamente utile. L'output dei moduli di profiling che ho provato non è intuitivo da interpretare.
Gprof2Dot trasforma l'output cProfile in un grafico dall'aspetto grazioso, con la catena più lenta (?) Evidenziata e un po 'di informazioni su ciascuna funzione (nome funzione, percentuale di tempo trascorso su questa funzione e numero di chiamate).
An example graph (1429x1896px)
io non ho fatto molto con l'App Engine, ma a profilare gli script non webapp, tendo al profilo lo script che esegue tutti i Unittests, che non può essere molto preciso al mondo reale situazioni
Uno (meglio?) metodo sarebbe quello di avere uno script che faccia una richiesta WSGI fasulla, quindi tracciarlo.
WSGI è un protocollo molto semplice, è fondamentalmente una funzione che accetta due argomenti, uno con informazioni di richiesta e il secondo con una funzione di richiamata (che viene utilizzata anche per impostare le intestazioni, tra le altre cose). Forse qualcosa di simile al seguente (il che è possibile per la lavorazione del pseudo codice) ...
class IndexHandler(webapp.RequestHandler):
"""Your site"""
def get(self):
self.response.out.write("hi")
if __name__ == '__main__':
application = webapp.WSGIApplication([
('.*', IndexHandler),
], debug=True)
# Start fake-request/profiling bit
urls = [
"/",
"/blog/view/hello",
"/admin/post/edit/hello",
"/makeanerror404",
"/makeanerror500"
]
def fake_wsgi_callback(response, headers):
"""Prints heads to stdout"""
print("\n".join(["%s: %s" % (n, v) for n, v in headers]))
print("\n")
for request_url in urls:
html = application({
'REQUEST_METHOD': 'GET',
'PATH_INFO': request_url},
fake_wsgi_callback
)
print html
In realtà, la documentazione di App Engine spiega un modo migliore di profiling vostra applicazione:
Da http://code.google.com/appengine/kb/commontasks.html#profiling:
Per definire il profilo delle prestazioni dell'applicazione, rinominare innanzitutto la funzione main()
dell'applicazione su real_main()
. Quindi, aggiungere una nuova funzione principale per la vostra applicazione, denominata profile_main()
come quello qui sotto:
def profile_main():
# This is the main function for profiling
# We've renamed our original main() above to real_main()
import cProfile, pstats
prof = cProfile.Profile()
prof = prof.runctx("real_main()", globals(), locals())
print "<pre>"
stats = pstats.Stats(prof)
stats.sort_stats("time") # Or cumulative
stats.print_stats(80) # 80 = how many to print
# The rest is optional.
# stats.print_callees()
# stats.print_callers()
print "</pre>"
[...]
Per abilitare il profiling con l'applicazione, impostare main = profile_main
. Per eseguire l'applicazione normalmente, è sufficiente impostare main = real_main
.
Aggiornamento: questo è ora parte del GAE SDK: http://googleappengine.blogspot.com/2010/02/app-engine-sdk-131-including-major.html http: // codice .google.com/appengine/docs/python/tools/appstats.html – Turadg