4

我想知道从触发第一个回调到最终结果的延迟执行需要多长时间。

关于如何做到这一点的任何想法,可能是以非侵入性方式(意味着不修改任何回调函数以跟踪执行时间)?

4

3 回答 3

8

如果你在“twistd”的帮助下运行你的程序,那么它有一个选项“--profile”可以帮助你分析扭曲的代码。

twistd "other options" --profile=statsfile --profiler=cProfile --savestats

并查看统计信息:

import pstats
stats = pstats.Stats('statsfile')
stats.sort_stats('time').print_stats()

回调在延迟触发后立即执行。但是立即意味着延迟链中的每个回调都必须执行,并且它们将有自己的执行时间。此外,各种代码将有自己的执行时间片,包括反应器循环。

所以说这个词——立即就是说尽快。

考虑以下不良示例:

from twisted.internet import reactor, defer
import time

def timeit(func):
    def wrapper(*arg):
        t1 = time.time()
        res = func(*arg)
        t2 = time.time()
        print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0)
        return res
    return wrapper

d = defer.Deferred()

@timeit
def callfunc1(result):
    print 'XXXXX'

@timeit   
def callfunc2(result):
    print 'YYYYY'

d.addCallback(callfunc1)   
d.addCallback(callfunc2)  
t1 = time.time()
d.callback(True)
t2 = time.time()
print '%0.3f ms' % ((t2-t1)*1000.0)

输出:

XXXXX
callfunc1 took 0.039 ms
YYYYY
callfunc2 took 0.005 ms
0.108 ms

现在,如果我们调整上面的代码以包含一个反应器和 callLater

于 2010-10-27T17:39:16.367 回答
3

猜猜你应该分析你的应用程序,按照这种方式:

安装这个工具http://kcachegrind.sourceforge.net/html/Home.html

启动你扭曲的应用程序并收集原始数据:

twistd --savestats -n --profile=myapp.hotshot myapp

然后,将“hotshot”转换为“calltree”,运行:

hotshot2cg myapp.hotshot > myapp.calltree

现在我们可以在 Kcachegrind 工具中查看 calltree。

kcachegrind myapp.calltree

使用此工具,您可以查看扭曲事件循环的调用图,以百分比形式查看执行时间。因此无需修补代码,只需运行此工具即可查看

用于检查内存的 PS: 如何使用 guppy/heapy 跟踪内存使用情况

于 2013-03-15T02:51:09.687 回答
1

对于我想要实现的目标,分析有点矫枉过正。

我最终得到了一个解决方案,它并不意味着对现有代码进行大量修改,但绝不是“通用的”:

我的原始代码是这样的:

def myfunc(*args):
    d = Deferred()
    d.addCallback(cb1)
    ...
    d.addCallback(lambda x: MyObject(x))

我现在有:

def myfunc(*args):
    init_time = time.time()
    d = Deferred()
    d.addCallback(cb1)
    ...
    d.addCallback(lambda x: MyObject(x, init_time))

class MyObject:
    def __init__(self, *args):
        ...
        self.exec_time = time.time() - init_time

它做的正是我想要的,但我希望 Deferred 结构会暴露一些跟踪执行时间本身的东西,而不必修补我的对象。从源代码中,我可以看到没有这样的东西可用:http ://twistedmatrix.com/trac/browser/tags/releases/twisted-10.0.0/twisted/internet/defer.py#L137

于 2010-10-28T11:32:27.970 回答