Flask + Jinja2:如何衡量性能

3

我需要比较使用 jinja2.Template.renderjinja2.Template.stream 的 Flask 应用程序的性能,以确保使用模板流不会导致性能损失。

我的(非常简单的)想法是在模板渲染之前和之后打印时间戳,但由于网页是由函数返回的,我不太确定如何实现这一点...

我的函数是:

def index():
    """main function"""
    env = Environment(loader=FileSystemLoader(basedir+'templates'))
    #I modify the global variables
    env.globals['foo'] = 'bar'
    env.globals['build_response']=build_response
    get_url = request.args.get('to_print', None)
    message = "the input was \"%s\"" % (get_url,)
    template = env.get_template('body.html')
    return Response(template.stream(message=message))
    #return template.render(message=message)

我需要测量的是花费的时间

by

return template.render(message=message)

vs

return Response(template.stream(message=message))

谢谢!
1个回答

2

在调用之前和之后,您需要查看系统时钟。

如果您不立即返回template.render或template.stream的响应,则更容易完成此操作。

例如:

from time import time

def index():
    # THE REST OF YOUR CODE GOES HERE
    start = time.time()
    resp = template.render(message=message)
    end = time.time()
    processing_time = end - start
    # LOG PROCESSING TIME SOMEPLACE
    return resp

它不起作用...我的意思是,对于“渲染”来说,这是一个很好的解决方案,但对于流来说就不行了,因为Response(template.stream(message=message))实际上并没有创建包含整个页面的完整响应,而是一个可以花费时间处理整个页面的流处理程序... - Giovanni Di Milia
2
使用Chrome、Safari或类似Charles的工具对第二个进行分析。实际上,两者都要进行分析。它们将向您展示请求从开始到结束所需的时间。如果唯一的变量是返回数据的方法,则差异应该是可量化的,这正是您要寻找的。 - tkone
如果你不能将流输出包装在某个东西中,那么你可能想尝试查看这个:http://docs.python.org/library/timeit.html - tkone
1
@mattb:是的,你完全可以在@app.before_request@app.teardown_request中实现这个功能,但我认为你需要将其存储在g对象中。例如,在before函数中添加g.start_time = time.time(),然后在teardown函数中计算总请求处理时间并将其写入日志。 - tkone
1
我需要将 from time import time 更改为 import time 才能让 time.time() 正常工作...FYI - timborden
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接