2009-03-24 28 views
15

Tôi hiện đang cố gắng tối ưu hóa trang web của mình, chạy trên appengine của google. Nó không phải là một nhiệm vụ dễ dàng, bởi vì tôi không sử dụng bất kỳ công cụ mạnh mẽ nào.Cách tốt nhất để cấu hình/tối ưu hóa trang web trên appengine của google

Có ai có kinh nghiệm trong việc tối ưu hóa mã python cho mục đích này không? Bạn đã tìm thấy một trình biên dịch python tốt?

Trả lời

13

Tôi đã tìm thấy Gprof2Dot cực kỳ hữu ích. Đầu ra của các mô-đun lược tả mà tôi đã cố gắng giải thích khá rõ ràng.

Gprof2Dot biến đầu ra cProfile thành biểu đồ đẹp, với chuỗi chậm nhất (?) Được đánh dấu và một chút thông tin về từng chức năng (tên hàm, phần trăm thời gian sử dụng chức năng này và số lượng cuộc gọi).

An example graph (1429x1896px)

Tôi đã không được thực hiện nhiều với App Engine, nhưng khi profiling kịch bản phi webapp, tôi có xu hướng để cấu hình kịch bản chạy tất cả các unittests, mà có thể không được rất chính xác để thực thế giới các tình huống

Phương pháp Một (tốt hơn?) sẽ có tập lệnh thực hiện yêu cầu WSGI giả, sau đó gửi tiểu sử đó.

WSGI thực sự là giao thức đơn giản, về cơ bản là một hàm lấy hai đối số, một với thông tin yêu cầu và hàm thứ hai có hàm gọi lại (được sử dụng để đặt tiêu đề, trong số các thứ khác). Có lẽ một cái gì đó như sau (mà có thể làm việc mã giả) ...

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 

Trên thực tế, các tài liệu App Engine giải thích một cách tốt hơn profiling ứng dụng của bạn:

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

Để cấu hình hiệu suất của ứng dụng, trước tiên hãy đổi tên chức năng main() của ứng dụng thành real_main(). Sau đó, thêm một chức năng chính mới để ứng dụng của bạn, tên profile_main() như hình dưới đây:

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

[...]

Để kích hoạt profiling với ứng dụng của bạn, thiết lập main = profile_main. Để chạy ứng dụng của bạn như bình thường, chỉ cần đặt main = real_main.

3

Để lược tả các cuộc gọi API, Guido van Rossum đã phát hành một thư viện có tên Appstats sẽ ghi lại và hiển thị nhiều nội dung hay về ứng dụng của bạn.

Bạn có thể nhận được các thư viện ở đây: https://sites.google.com/site/appengineappstats/

tôi đã viết một bài viết về nó trên blog của tôi (với một số ảnh chụp màn hình): http://blog.dantup.com/2010/01/profiling-google-app-engine-with-appstats

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

+2

Cập nhật: điều này bây giờ là một phần của GAE SDK: http://googleappengine.blogspot.com/2010/02/app-engine-sdk-131-including-major.html http: // đang .google.com/appengine/docs/python/tools/appstats.html – Turadg

Các vấn đề liên quan