【问题标题】:Is there a significant performance penalty for using deep template inheritance in django?在 django 中使用深度模板继承是否有显着的性能损失?
【发布时间】:2013-02-16 09:26:56
【问题描述】:

在我的 django 应用程序中,我有一个典型的基本模板,其中包含我的 doctype、script 和 css 标签等内容。

为了清晰和代码组织,我将这个基本模板解构为它的组成部分,其中每个部分都扩展了前一个部分,只添加了一个特定的东西。例如base/favicon.html:

{% extends "base/chromeframe.html" %}
{% load staticlink %}

{% block metatags %}{{ block.super }}
<link href="{% staticlink 'img/favicon.ico' %}" rel="shortcut icon" type="image/x-icon">{% endblock metatags %}

扩展 base/chromeframe.html:

{% extends "base/mobile.html" %}

{% block metatags %}{{ block.super }}{% if 'chromeframe' in request.META.HTTP_USER_AGENT %}
<meta http-equiv="X-UA-Compatible" content="chrome=1">{% endif %}{% endblock metatags %}

这使我的基本模板更易于管理。 我是否为这种方法付出了很大的性能损失?什么是基准模板渲染的好方法?

在您建议我使用包含而不是继承之前 - 这不起作用,因为我正在设置被从我的基本模板派生的页面覆盖的块。

我知道我可以对这些模板部分进行某种预编译。

【问题讨论】:

  • 配置文件配置文件。
  • @pst 谢谢,我知道。我在这里要求避免花费时间和精力进行自己的测试。懒惰或从别人的经验中学习,这取决于你如何看待它。

标签: django django-templates django-testing


【解决方案1】:

我已经证实了传统观点 - 即使有 22 层“不必要的”继承,渲染时间的差异也很小。

我的测试:

import time

from django.core.management.base import BaseCommand
from django.shortcuts import render_to_response as r2r

ITTER=100

class Command(BaseCommand):
    def handle(self, *args, **options):
        start = time.clock()
        for i in range(ITTER):
            r2r('base.html', { 'i': i },)
        middle = time.clock()
        for i in range(ITTER):
            r2r('newbase.html', { 'i': i },)
        end = time.clock()
        print "old way:%f new way:%f" % (middle-start, end-middle)

我煞费苦心地将我的基本模板片段重新集成到 newbase.html 中,只发现性能提升很小:

旧方式:1.770000 新方式:1.460000

仍然有显着的性能提升,但不足以证明 newbase.html 所导致的不可读的混乱。

我会在别处寻找优化。

【讨论】:

    【解决方案2】:

    我从未注意到模板执行时间是页面加载时间的一个重要因素,除非您运行的是流量极高的网站,否则担心它可能属于过早优化的范畴。

    在几乎所有情况下,优化您的代码以简化开发和维护而不是提高执行速度会为您提供最好的服务。

    但是,如果您想了解需要多长时间,请查看Django page on profiling

    【讨论】:

    • 你说的对我来说很有意义,这也是我采用这种方法的原因。但是让我想知道的一件事是,每当模板标签中出现运行时错误时,就会看到大量的 django 错误报告。调用堆栈非常深。我在一个小型虚拟服务器上运行一个流量相当大的网站,所以服务器性能是我关心的问题。
    猜你喜欢
    • 2011-06-25
    • 2017-02-11
    • 2011-09-12
    • 2015-11-13
    • 2012-06-20
    • 2010-12-23
    • 2011-12-24
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多