我遇到了一些性能问题,这让我感到困惑。我在MySQL中使用了Django。我执行以下操作:
1.使用Ajax从网页发送数据。
2.在Views.py中接收post数据,并通过许多函数调用处理它,将数据插入到MySQL中。我要做的第一件事就是设置一个Python变量timeStart。在返回响应之前,我要做的最后一件事是计算处理数据的时间:
processTime = time.clock() - timeStart 我使用render-to-response发送响应,其中响应是processTime。
3.网页上会显示processTime。
processTime为1.5秒,但是从通过Ajax发送数据到接收响应的总时间是13秒。渲染一个简单的页面以及发送和接收数据需要11.5秒--这是一个很长的时间。但后来事情变得更奇怪了。我缩短了views.py函数,几乎立即返回一个响应。这将处理时间从1.5秒减少到几乎为0。但它也将总时间从13秒减少到大约2秒。这似乎表明,实际上,这是数据处理缓慢的原因。然而,这并不能解释计算出的processTime仅为1.5秒。我确实在第一行设置了startTime,并在最后一行计算了processTime。StartTime未被覆盖。
这几乎就像是有某种清理过程或与完成并发送响应相关的东西,依赖于函数调用的东西。但是什么呢?或者我正在做一些愚蠢的事情来计算我的时间?我设置了debug = False。
编辑-额外信息:
模板只包含"hello“和{{result}}两个字。我没有返回任何查询集,只返回结果:{‘processTime’:processTime}
当我使用MySQL存储函数时,可能会出现时间差。就像它返回结果一样,但仍在做一些事情?
发布于 2012-07-21 00:13:11
问题出在我测量processTime的方式上。我需要使用time.time(),而不是time.clock()。time.clock()告诉我我只花了1.5秒,但这显然只是CPU时间,而不是实际时间。在view.py中花费的实际时间更像是13秒,这与我为整个事务测量的时间相对应。
发布于 2012-07-16 22:47:43
您拥有在模板呈现阶段查询的ORM/DB模型查询集。这不是由您的视图计算的。磁盘命中导致了大约10秒。
或者,它是由您的视图通过一些与ORM相关的中间件触发的,这些中间件在发送回HTTP响应之前执行进一步的DB操作。
打开并检查数据库日志记录。
发布于 2012-07-16 22:58:39
您还没有给出如何返回响应的适当细节,但我猜您正在做这样的事情:
data = MyModel.objects.all()
processTime = time.clock() - timeStart
return render_to_response('my_template.html, {'processTime': processTime,
'data': myqueryset})因此,processTime的计算远不是创建响应时发生的最后一件事,因为整个模板渲染都是在之后进行的。有两个因素可以打折:呈现模板本身的成本,这远远不是很便宜(Django的模板语言不是特别有效);以及任何数据库调用的成本:例如,我下面给出的MyModel.objects.all()查找实际上不会到达数据库,直到在模板中迭代它,所以这应该是在processTime计算之后。
在任何情况下,您都应该研究Django调试工具栏,它为您提供了更好的渲染时间细分。
https://stackoverflow.com/questions/11505336
复制相似问题