1

我遇到了一些让我感到困惑的性能问题。我正在将 Django 与 MySQL 一起使用。我执行以下操作:

1. 使用 Ajax 从网页发送数据。

2. 在 Views.py 中接收 post 数据并通过许多函数调用对其进行处理,将数据插入 MySQL。我做的第一件事是设置一个 Python 变量 timeStart。在返回响应之前,我要做的最后一件事是计算处理数据的时间:

processTime = time.clock() - timeStart 

我使用渲染到响应发送响应,其中响应是 processTime。

3. processTime 显示在网页上。

processTime 为 1.5 秒,但从通过 Ajax 发送数据到收到响应的总时间为 13 秒。11.5 秒来呈现一个简单的页面并发送和接收数据 - 这是一个很长的时间。但后来它变得更奇怪了。我缩短了 views.py 函数,几乎立即发回了响应。这将处理时间从 1.5 秒减少到几乎 0。但它也将总时间从 13 秒减少到大约 2 秒。这似乎表明,事实上,数据处理速度很慢。但是,这并不能解释计算出的 processTime 仅达到 1.5 秒。我确实在第一行设置了 startTime,并在最后一行计算了 processTime。StartTime 不会被覆盖。

就好像有某种清理过程或与完成和发送响应相关的东西,这取决于函数调用。但是什么?或者我在计算时间时做了一些愚蠢的事情?我已设置调试 = False。

编辑 - 额外信息:

该模板仅包含单词“hello”和 {{result}}。我没有返回任何查询集,只是 processTime: {'result':processTime}

当我使用 MySQL 存储函数时,似乎可能会出现时差。就像它正在返回结果,但仍然在做某事????

4

3 回答 3

0

您没有提供有关如何返回响应的正确详细信息,但我猜您正在做这样的事情:

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 调试工具栏,它可以为您提供更好的渲染时间细分。

于 2012-07-16T14:58:39.167 回答
0

问题在于我测量 processTime 的方式。我需要使用 time.time(),而不是 time.clock()。time.clock() 告诉我我只花了 1.5 秒,但这显然只是 CPU 时间,而不是实际时间。在 view.py 中花费的实际时间更像是 13 秒,这与我为完整事务测量的时间相对应。

于 2012-07-20T16:13:10.620 回答
0

您有在模板渲染阶段正在查询的 ORM/DB 模型查询集。你的观点没有计算在内。磁盘命中导致约 10 秒。

要么是这样,要么是您的视图通过一些与 ORM 相关的中间件触发它,在发回 HTTP 响应之前执行进一步的数据库操作。

打开并检查您的数据库日志记录。

于 2012-07-16T14:47:42.617 回答