为啥这个 Jinja2 模板的渲染速度不比 Django 快?

Posted

技术标签:

【中文标题】为啥这个 Jinja2 模板的渲染速度不比 Django 快?【英文标题】:Why isn't this Jinja2 template rendering faster than Djangos?为什么这个 Jinja2 模板的渲染速度不比 Django 快? 【发布时间】:2012-01-09 06:41:43 【问题描述】:

我很想知道 Jinja2 (2.6) 比普通的 Django (1.3.1) 模板引擎快多少。

运行它我得到:

Django: 275.729 ms per iteration
Jinja2: 281.190 ms per iteration

(越小越好)

这是 Django 基准测试:http://hastebin.com/DyGcxEybYd.py

这是 Jinja2 基准测试:http://hastebin.com/uorDENWrkM.py

作为参考,相同的 Tornado 模板测试成功地在 28.127 ms per iteration 中完成,速度快了大约 10 倍,这几乎是难以置信的。

相同的 Tornado 基准测试:http://hastebin.com/F9PcqGb2sZ.py

更新

不幸的是,OSX 无法可靠地进行基准测试。可能只是操作系统,也可能是我正在运行一堆其他 GUI 应用程序,例如带有太多选项卡的浏览器。在非常低负载的 Debian 服务器上再次尝试所有这些,我得到了这些数字:

(manually rounded from having run it many times over a long period)
Django: 475 ms per iteration
Jinja2: 16 ms per iteration 
Tornado: 50 ms per iteration

我的工作环境是 OSX,但服务器都是 Linuxy,所以这让我很满意。

【问题讨论】:

哦,天哪,5ms 的差异,你将如何忍受它。而且,像这样的基准测试完全没用,我会一直重复到我死的那一天。 尝试旧版本的 Jinja。似乎在 2.5.5 时与 Tornado 竞争 澄清一下;我不仅希望 Jinja2 更快,而且速度要快得多。 Jinja2 目前比 Django 慢 2%。 Jinja2 的字节码缓存是否默认开启? Jinja2 是如何安装的,MarkupSafe 是如何安装的?我不确定您为什么希望 Jinja2 明显更快,但如果是因为这些优化,您应该仔细检查它们。 叹息 :( 今天重试,我反复得到 Jinja 大约 100 毫秒,但 Django 仍然(重复)大约 275 毫秒!那是怎么回事!?! 【参考方案1】:

我无法重现您的结果。我使用了你的测试文件并生成了一个空白的 Django 项目

django-admin.py startproject foo && cd foo

使用 Tornado 2.1.1,我每次迭代都能获得一致的 45ms。 使用 Django 1.3.1,每次迭代我得到 480ms

对于 Jinja2,我进行了 4 次测试。 2.5.2 和 2.6 有和没有MarkupSafe:

2.5.2:

w/ MarkupSafe:19ms 无:14 毫秒

2.6:

w/:14ms 无:15 毫秒

有趣的是,MarkupSafe 实际上显着降低了 2.5.2 的速度(尽管仍然只有 5 毫秒),但这可能是因为我没有与 Jinja2 2.5.2 同时代的 MarkupSafe 版本。

您的测试也没有使用 Jinja2 字节码缓存,这可能会大大加快它的速度。我不确定 Django 是否有模板代码缓存——我知道它有片段缓存,但我不确定整个事情。


更新:我尝试了内置的MemcachedBytecodeCache,它使 Jinja2 的速度降低了 2.6 到 22 毫秒,可能是因为在这么简单的模板上,网络活动比构建它更糟糕。使用进程内内存缓存,同样是 14 毫秒。

【讨论】:

以上是关于为啥这个 Jinja2 模板的渲染速度不比 Django 快?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 django 模板渲染字典这么慢?

Jinja2模板引擎简介

渲染 Jinja2 宏而不影响模板其余部分的内容

使用 jinja2 模板引擎渲染 django 表单

jinja2渲染使用

模板渲染