Mercurial > genshi > mirror
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 --- /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)