2012-01-28 65 views
0

如何测量Python模块的import加载时间/延迟AppEngine如何测量AppEngine中的Python导入加载时间/延迟

我希望收到此类报告:

module_name -> 1s 
... 

我已经实现/测试基于sys.path_hooks__import__修补了一些解决方案,但它与纯Python的作品,但不是AppEngine

任何有经验的人都可以在AppEngine/Python或纯Python中建议/分享一些提示吗?

回答

0

我发现这样的解决方案来跟踪App Engine上的时间 - 并非完全线程安全 - 您认为什么?

module.py

# coding=utf-8 
## \authors Cezary K. Wagner 

from threading import Lock 

__indent = 0 
__patched = False 

def logImports(): 
    global __patched 
    if __patched == True: 
    return 

    import time 
    import logging 
# import inspect 
    import __builtin__ 

    original__import__ = __builtin__.__import__ 

    def patched__import__(name, *args): 
    global __indent 
    lock = Lock() 
    lock.acquire() 
    spaces = ' ' * (__indent * 2) 
# callerFrame = inspect.currentframe().f_back 
# moduleName = callerFrame.f_globals['__name__'] 
# lineNumber = callerFrame.f_lineno 
# logging.debug('%simport start %s %s:%s.' % (spaces, name, moduleName, lineNumber)) 
    __indent += 1 
    start = time.clock() 
    try: 
     module = original__import__(name, *args) 
     delta = time.clock() - start 
    # import could fail 
    finally: 
     lock.release 
     __indent -= 1 
    if delta >= 1.0: 
     logging.debug('%simport end %s in %ss' % (spaces, name, delta)) 
    return module 

    __builtin__.__import__ = patched__import__ 
    __patched = True 

usage.py

from module import logImports 
logImports() 

import math 
1

Google App Engine caches imports这可能是为path_hooks搞砸了。
由于导入的是缓存,它们通常不会在生产环境中引起任何重大问题。

+0

问题是延迟与负载可能会导致**期限超过例外** 60年代以来时间限制 - 如你所说,如果**它加载它会很快** - 问题是加载延迟。 如果你使用很多模块可能会有问题,因为每个模块都可以做一些非惰性缓存(在需要之前准备数据)。 – Chameleon 2012-01-28 12:46:22

+0

您仍然可以在本地进行测试,并且您将在本地执行的改进也会对服务器产生影响。 – 2012-01-28 19:10:20

+0

当然是时间就是金钱,结果将会与生产服务器不同 - 不值得 - 我会这样做的解决方案... – Chameleon 2012-01-28 23:40:16