2009-03-24 19 views

Respuesta

13

he encontrado Gprof2Dot extremadamente útil. El resultado de los módulos de perfiles que he probado es bastante poco intuitivo de interpretar.

Gprof2Dot convierte la salida cProfile en un gráfico atractivo, con la cadena más lenta (?) Resaltada y un poco de información sobre cada función (nombre de función, porcentaje de tiempo empleado en esta función y número de llamadas).

An example graph (1429x1896px)

No he hecho mucho con el App Engine, pero al perfilar los alfabetos no webapp, tiendo a perfilar el script que se ejecuta todos los unittests, que pueden no ser muy precisa para el mundo real situaciones

Un método (¿mejor?) sería tener una secuencia de comandos que realiza una solicitud falsa de WSGI, luego perfilar eso.

WSGI es un protocolo realmente simple, es básicamente una función que toma dos argumentos, uno con información de solicitud y el segundo con una función de devolución de llamada (que se usa para establecer encabezados, entre otras cosas). Tal vez algo como lo siguiente (que es posible trabajar-pseudocódigo) ...

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 

En realidad, la documentación de App Engine explica una mejor manera de perfilar su aplicación:

De http://code.google.com/appengine/kb/commontasks.html#profiling:

Para perfilar el rendimiento de su aplicación, primero cambie el nombre de la función main() de su aplicación al real_main(). A continuación, añadir una nueva función principal para su aplicación, llamada profile_main() como la de abajo:

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>" 

[...]

Para habilitar el perfilado con su aplicación, establezca main = profile_main. Para ejecutar su aplicación de manera normal, simplemente configure main = real_main.

3

Para perfilar las llamadas API, Guido van Rossum lanzó una biblioteca llamada Appstats que registrará y mostrará muchas cosas buenas sobre su aplicación.

Usted puede obtener la biblioteca aquí: https://sites.google.com/site/appengineappstats/

escribí un artículo sobre el tema en mi blog (con algunas capturas de pantalla): http://blog.dantup.com/2010/01/profiling-google-app-engine-with-appstats

Appstats http://blog.dantup.com/pi/appstats_4_thumb.png

+2

Actualización: esto es ahora parte del SDK de GAE: http://googleappengine.blogspot.com/2010/02/app-engine-sdk-131-including-major.html http: // código .google.com/appengine/docs/python/tools/appstats.html – Turadg

Cuestiones relacionadas