changeset 76:85f70ec37112 trunk

Add Django to the benchmark.
author cmlenz
date Thu, 13 Jul 2006 09:17:21 +0000
parents 3722696d0343
children f5ec6d4a61e4
files examples/bench/clearsilver/template.cs examples/bench/django/templates/base.html examples/bench/django/templates/template.html examples/bench/django/templatetags/__init__.py examples/bench/django/templatetags/bench.py examples/bench/kid/template.kid examples/bench/markup/template.html examples/bench/run.py
diffstat 8 files changed, 115 insertions(+), 63 deletions(-) [+]
line wrap: on
line diff
--- a/examples/bench/clearsilver/template.cs
+++ b/examples/bench/clearsilver/template.cs
@@ -7,9 +7,9 @@
   </head>
   <body>
     <?cs include:"header.cs" ?>
-    <?cs call:greeting('you') ?>
+    <?cs call:greeting(user) ?>
     <?cs call:greeting('me') ?>
-    <?cs call:greeting('all the others') ?>
+    <?cs call:greeting('world') ?>
     
     <h2>Loop</h2>
     <?cs if:len(items) ?>
new file mode 100644
--- /dev/null
+++ b/examples/bench/django/templates/base.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html
+    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+
+  {% block body %}
+    <div id="header">
+      <h1>{{ title|escape }}</h1>
+    </div>
+    {{ block.super }}
+    <div id="footer"></div>
+  {% endblock %}
+
+</html>
new file mode 100644
--- /dev/null
+++ b/examples/bench/django/templates/template.html
@@ -0,0 +1,22 @@
+{% extends "base.html" %}
+{% load bench %}
+
+<head>
+  <title>${title|escape}</title>
+</head>
+
+{% block body %}
+  <div>{% greeting user %}</div>
+  <div>{% greeting "me" %}</div>
+  <div>{% greeting "world" %}</div>
+
+  <h2>Loop</h2>
+  {% if items %}
+    <ul>
+      {% for item in items %}
+        <li{% if forloop.islast %} class="last"{% endif %}>{{ item|escape }}</li>
+      {% endfor %}
+    </ul>
+  {% endif %}
+
+{% endblock %}
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/examples/bench/django/templatetags/bench.py
@@ -0,0 +1,8 @@
+from django.template import Library, Node, resolve_variable
+from django.utils.html import escape
+
+register = Library()
+
+def greeting(name):
+    return 'Hello, %s!' % escape(name)
+greeting = register.simple_tag(greeting)
--- a/examples/bench/kid/template.kid
+++ b/examples/bench/kid/template.kid
@@ -9,9 +9,9 @@
     <title>${title}</title>
   </head>
   <body>
-    <div>${greeting('you')}</div>
+    <div>${greeting(user)}</div>
     <div>${greeting('me')}</div>
-    <div>${greeting('all the others')}</div>
+    <div>${greeting('world')}</div>
     
     <h2>Loop</h2>
     <ul py:if="items">
--- a/examples/bench/markup/template.html
+++ b/examples/bench/markup/template.html
@@ -10,9 +10,9 @@
     <title>${title}</title>
   </head>
   <body>
-    <div>${greeting('you')}</div>
+    <div>${greeting(user)}</div>
     <div>${greeting('me')}</div>
-    <div>${greeting('all the others')}</div>
+    <div>${greeting('world')}</div>
 
     <h2>Loop</h2>
     <ul py:if="items">
--- a/examples/bench/run.py
+++ b/examples/bench/run.py
@@ -4,98 +4,106 @@
 import time
 import timeit
 
+__all__ = ['markup', 'clearsilver', 'django', 'kid']
+
 def markup(dirname):
     from markup.template import Context, TemplateLoader
     loader = TemplateLoader([dirname], auto_reload=False)
     template = loader.load('template.html')
     def render():
-        ctxt = Context(title='Just a test',
+        ctxt = Context(title='Just a test', user='joe',
                        items=['Number %d' % num for num in range(1, 15)])
-        template.generate(ctxt).render('html')
+        return template.generate(ctxt).render('html')
     return render
 
 def cheetah(dirname):
     # FIXME: infinite recursion somewhere... WTF?
-    try:
-        from Cheetah.Template import Template
-        class MyTemplate(Template):
-            def serverSidePath(self, path): return os.path.join(dirname, path)
-        filename = os.path.join(dirname, 'template.tmpl')
-        template = MyTemplate(file=filename)
+    from Cheetah.Template import Template
+    class MyTemplate(Template):
+        def serverSidePath(self, path): return os.path.join(dirname, path)
+    filename = os.path.join(dirname, 'template.tmpl')
+    template = MyTemplate(file=filename)
 
-        def render():
-            template = MyTemplate(file=filename,
-                                  searchList=[{'title': 'Just a test',
-                                               'items': [u'Number %d' % num for num in range(1, 15)]}])
-            template.respond()
-        return render
-    except ImportError:
-        return None
+    def render():
+        template = MyTemplate(file=filename,
+                              searchList=[{'title': 'Just a test', 'user': 'joe',
+                                           'items': [u'Number %d' % num for num in range(1, 15)]}])
+        return template.respond()
+    return render
 
 def clearsilver(dirname):
-    try:
-        import neo_cgi
-        neo_cgi.update()
-        import neo_util
-        import neo_cs
-        def render():
-            hdf = neo_util.HDF()
-            hdf.setValue('hdf.loadpaths.0', dirname)
-            hdf.setValue('title', escape('Just a test'))
-            for num in range(1, 15):
-                hdf.setValue('items.%d' % (num - 1), escape('Number %d' % num))
-            cs = neo_cs.CS(hdf)
-            cs.parseFile('template.cs')
-            cs.render()
-        return render
-    except ImportError:
-        return None
+    import neo_cgi
+    neo_cgi.update()
+    import neo_util
+    import neo_cs
+    def render():
+        hdf = neo_util.HDF()
+        hdf.setValue('hdf.loadpaths.0', dirname)
+        hdf.setValue('title', escape('Just a test'))
+        hdf.setValue('user', escape('joe'))
+        for num in range(1, 15):
+            hdf.setValue('items.%d' % (num - 1), escape('Number %d' % num))
+        cs = neo_cs.CS(hdf)
+        cs.parseFile('template.cs')
+        return cs.render()
+    return render
+
+def django(dirname):
+    from django.conf import settings
+    settings.configure(TEMPLATE_DIRS=[os.path.join(dirname, 'templates')])
+    from django import template, templatetags
+    from django.template import loader
+    templatetags.__path__.append(os.path.join(dirname, 'templatetags'))
+    tmpl = loader.get_template('template.html')
+
+    def render():
+        data = {'title': 'Just a test', 'user': 'joe',
+                'items': ['Number %d' % num for num in range(1, 15)]}
+        return tmpl.render(template.Context(data))
+    return render
 
 def kid(dirname):
-    try:
-        import kid
-        kid.path = kid.TemplatePath([dirname])
-        template = kid.Template(file='template.kid')
-        def render():
-            template = kid.Template(file='template.kid',
-                                    title='Just a test',
-                                    items=['Number %d' % num for num in range(1, 15)])
-            template.serialize(output='xhtml')
-        return render
-    except ImportError:
-        return None
+    import kid
+    kid.path = kid.TemplatePath([dirname])
+    template = kid.Template(file='template.kid')
+    def render():
+        template = kid.Template(file='template.kid',
+                                title='Just a test', user='joe',
+                                items=['Number %d' % num for num in range(1, 15)])
+        return template.serialize(output='xhtml')
+    return render
 
 def nevow(dirname):
     # FIXME: can't figure out the API
-    try:
-        from nevow.loaders import xmlfile
-        template = xmlfile('template.xml', templateDir=dirname).load()
-        def render():
-            print template
-        return render
-    except ImportError:
-        return None
+    from nevow.loaders import xmlfile
+    template = xmlfile('template.xml', templateDir=dirname).load()
+    def render():
+        print template
+    return render
 
-def main(engines):
+def run(engines):
     basepath = os.path.abspath(os.path.dirname(__file__))
     for engine in engines:
         dirname = os.path.join(basepath, engine)
-        print '%s:' % engine.capitalize()
+        print '%s:' % engine.capitalize(),
         t = timeit.Timer(setup='from __main__ import %s; render = %s("%s")'
                                % (engine, engine, dirname),
                          stmt='render()')
         print '%.2f ms' % (1000 * t.timeit(number=2000) / 2000)
 
+
 if __name__ == '__main__':
     engines = [arg for arg in sys.argv[1:] if arg[0] != '-']
+    if not engines:
+        engines = __all__
 
     if '-p' in sys.argv:
         import hotshot, hotshot.stats
         prof = hotshot.Profile("template.prof")
-        benchtime = prof.runcall(main, engines)
+        benchtime = prof.runcall(run, engines)
         stats = hotshot.stats.load("template.prof")
         stats.strip_dirs()
         stats.sort_stats('time', 'calls')
         stats.print_stats()
     else:
-        main(engines)
+        run(engines)
Copyright (C) 2012-2017 Edgewall Software