diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-11-20 18:21:33 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-11-20 18:21:33 +0000 |
| commit | 9cf1c1b3d33efc58e6c658c2331894862fe9edb0 (patch) | |
| tree | 9d79bb1c89117123ed1abe2d07ee587f29bf66a4 /examples | |
| parent | c5eae67494631f904662235d9b6baf974482e466 (diff) | |
| download | external_python_mako-9cf1c1b3d33efc58e6c658c2331894862fe9edb0.tar.gz external_python_mako-9cf1c1b3d33efc58e6c658c2331894862fe9edb0.tar.bz2 external_python_mako-9cf1c1b3d33efc58e6c658c2331894862fe9edb0.zip | |
benchmarks....beating cheetah so far ! woop
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/bench/basic.py | 128 | ||||
| -rw-r--r-- | examples/bench/cheetah/footer.tmpl | 2 | ||||
| -rw-r--r-- | examples/bench/cheetah/header.tmpl | 5 | ||||
| -rw-r--r-- | examples/bench/cheetah/template.tmpl | 31 | ||||
| -rw-r--r-- | examples/bench/django/templates/base.html | 14 | ||||
| -rw-r--r-- | examples/bench/django/templates/template.html | 22 | ||||
| -rw-r--r-- | examples/bench/django/templatetags/__init__.py | 0 | ||||
| -rw-r--r-- | examples/bench/django/templatetags/bench.py | 8 | ||||
| -rw-r--r-- | examples/bench/genshi/base.html | 17 | ||||
| -rw-r--r-- | examples/bench/genshi/template.html | 24 | ||||
| -rw-r--r-- | examples/bench/kid/base.kid | 15 | ||||
| -rw-r--r-- | examples/bench/kid/template.kid | 22 | ||||
| -rw-r--r-- | examples/bench/mako/footer.html | 2 | ||||
| -rw-r--r-- | examples/bench/mako/header.html | 5 | ||||
| -rw-r--r-- | examples/bench/mako/template.html | 32 | ||||
| -rw-r--r-- | examples/bench/myghty/base.myt | 29 | ||||
| -rw-r--r-- | examples/bench/myghty/template.myt | 30 |
17 files changed, 386 insertions, 0 deletions
diff --git a/examples/bench/basic.py b/examples/bench/basic.py new file mode 100644 index 0000000..81c7c67 --- /dev/null +++ b/examples/bench/basic.py @@ -0,0 +1,128 @@ +from cgi import escape +import os +from StringIO import StringIO +import sys +import timeit + +__all__ = ['myghty', 'django', 'kid', 'genshi', 'cheetah', 'mako'] + +def genshi(dirname, verbose=False): + from genshi.template import TemplateLoader + loader = TemplateLoader([dirname], auto_reload=False) + template = loader.load('template.html') + def render(): + data = dict(title='Just a test', user='joe', + items=['Number %d' % num for num in range(1, 15)]) + return template.generate(**data).render('xhtml') + + if verbose: + print render() + return render + +def myghty(dirname, verbose=False): + from myghty import interp + interpreter = interp.Interpreter(component_root=dirname) + def render(): + data = dict(title='Just a test', user='joe', + items=['Number %d' % num for num in range(1, 15)]) + buffer = StringIO() + interpreter.execute("template.myt", request_args=data, out_buffer=buffer) + return buffer.getvalue() + if verbose: + print render() + return render + +def mako(dirname, verbose=False): + from mako.template import Template + from mako.lookup import TemplateLookup + lookup = TemplateLookup(directories=[dirname]) + template = lookup.get_template('template.html') + def render(): + return template.render(title="Just a test", user="joe", list_items=[u'Number %d' % num for num in range(1,15)]) + if verbose: + print render() + return render + +def cheetah(dirname, verbose=False): + from Cheetah.Template import Template + filename = os.path.join(dirname, 'template.tmpl') + template = Template(file=filename) + def render(): + template.__dict__.update({'title': 'Just a test', 'user': 'joe', + 'list_items': [u'Number %d' % num for num in range(1, 15)]}) + return template.respond() + + if verbose: + print render() + return render + +def django(dirname, verbose=False): + 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)) + + if verbose: + print render() + return render + +def kid(dirname, verbose=False): + 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') + + if verbose: + print render() + return render + + +def run(engines, number=2000, verbose=False): + basepath = os.path.abspath(os.path.dirname(__file__)) + for engine in engines: + dirname = os.path.join(basepath, engine) + if verbose: + print '%s:' % engine.capitalize() + print '--------------------------------------------------------' + else: + print '%s:' % engine.capitalize(), + t = timeit.Timer(setup='from __main__ import %s; render = %s(r"%s", %s)' + % (engine, engine, dirname, verbose), + stmt='render()') + + time = t.timeit(number=number) / number + if verbose: + print '--------------------------------------------------------' + print '%.2f ms' % (1000 * time) + if verbose: + print '--------------------------------------------------------' + + +if __name__ == '__main__': + engines = [arg for arg in sys.argv[1:] if arg[0] != '-'] + if not engines: + engines = __all__ + + verbose = '-v' in sys.argv + + if '-p' in sys.argv: + import hotshot, hotshot.stats + prof = hotshot.Profile("template.prof") + benchtime = prof.runcall(run, engines, number=100, verbose=verbose) + stats = hotshot.stats.load("template.prof") + stats.strip_dirs() + stats.sort_stats('time', 'calls') + stats.print_stats() + else: + run(engines, verbose=verbose) diff --git a/examples/bench/cheetah/footer.tmpl b/examples/bench/cheetah/footer.tmpl new file mode 100644 index 0000000..1b00330 --- /dev/null +++ b/examples/bench/cheetah/footer.tmpl @@ -0,0 +1,2 @@ +<div id="footer"> +</div> diff --git a/examples/bench/cheetah/header.tmpl b/examples/bench/cheetah/header.tmpl new file mode 100644 index 0000000..432487f --- /dev/null +++ b/examples/bench/cheetah/header.tmpl @@ -0,0 +1,5 @@ +<div id="header"> + <h1>$title</h1> +</div> + + diff --git a/examples/bench/cheetah/template.tmpl b/examples/bench/cheetah/template.tmpl new file mode 100644 index 0000000..a0b5593 --- /dev/null +++ b/examples/bench/cheetah/template.tmpl @@ -0,0 +1,31 @@ +<!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"> + <head> + <title>${title}</title> + </head> + <body> + + #def greeting(name) + <p>hello ${name}!</p> + #end def + + #include "cheetah/header.tmpl" + + $greeting($user) + $greeting('me') + $greeting('world') + + <h2>Loop</h2> + #if $list_items + <ul> + #for $list_item in $list_items + <li>$list_item</li> + #end for + </ul> + #end if + + #include "cheetah/footer.tmpl" + </body> +</html> diff --git a/examples/bench/django/templates/base.html b/examples/bench/django/templates/base.html new file mode 100644 index 0000000..8e64906 --- /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> diff --git a/examples/bench/django/templates/template.html b/examples/bench/django/templates/template.html new file mode 100644 index 0000000..1ab56cc --- /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 %} diff --git a/examples/bench/django/templatetags/__init__.py b/examples/bench/django/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/examples/bench/django/templatetags/__init__.py diff --git a/examples/bench/django/templatetags/bench.py b/examples/bench/django/templatetags/bench.py new file mode 100644 index 0000000..7bf0abc --- /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) diff --git a/examples/bench/genshi/base.html b/examples/bench/genshi/base.html new file mode 100644 index 0000000..f53abf2 --- /dev/null +++ b/examples/bench/genshi/base.html @@ -0,0 +1,17 @@ +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:py="http://genshi.edgewall.org/" + py:strip=""> + + <p py:def="greeting(name)"> + Hello, ${name}! + </p> + + <body py:match="body"> + <div id="header"> + <h1>${title}</h1> + </div> + ${select('*')} + <div id="footer" /> + </body> + +</html> diff --git a/examples/bench/genshi/template.html b/examples/bench/genshi/template.html new file mode 100644 index 0000000..cdcc327 --- /dev/null +++ b/examples/bench/genshi/template.html @@ -0,0 +1,24 @@ +<!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" + xmlns:py="http://genshi.edgewall.org/" + xmlns:xi="http://www.w3.org/2001/XInclude" + lang="en"> + <xi:include href="base.html" /> + <head> + <title>${title}</title> + </head> + <body> + <div>${greeting(user)}</div> + <div>${greeting('me')}</div> + <div>${greeting('world')}</div> + + <h2>Loop</h2> + <ul py:if="items"> + <li py:for="idx, item in enumerate(items)" py:content="item" + class="${idx + 1 == len(items) and 'last' or None}" /> + </ul> + + </body> +</html> diff --git a/examples/bench/kid/base.kid b/examples/bench/kid/base.kid new file mode 100644 index 0000000..061e9dd --- /dev/null +++ b/examples/bench/kid/base.kid @@ -0,0 +1,15 @@ +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:py="http://purl.org/kid/ns#"> + + <p py:def="greeting(name)"> + Hello, ${name}! + </p> + + <body py:match="item.tag == '{http://www.w3.org/1999/xhtml}body'" py:strip=""> + <div id="header"> + <h1>${title}</h1> + </div> + ${item} + <div id="footer" /> + </body> +</html> diff --git a/examples/bench/kid/template.kid b/examples/bench/kid/template.kid new file mode 100644 index 0000000..5da52e4 --- /dev/null +++ b/examples/bench/kid/template.kid @@ -0,0 +1,22 @@ +<!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" + xmlns:py="http://purl.org/kid/ns#" + py:extends="'base.kid'" + lang="en"> + <head> + <title>${title}</title> + </head> + <body> + <div>${greeting(user)}</div> + <div>${greeting('me')}</div> + <div>${greeting('world')}</div> + + <h2>Loop</h2> + <ul py:if="items"> + <li py:for="idx, item in enumerate(items)" py:content="item" + class="${idx + 1 == len(items) and 'last' or None}" /> + </ul> + </body> +</html> diff --git a/examples/bench/mako/footer.html b/examples/bench/mako/footer.html new file mode 100644 index 0000000..1b00330 --- /dev/null +++ b/examples/bench/mako/footer.html @@ -0,0 +1,2 @@ +<div id="footer"> +</div> diff --git a/examples/bench/mako/header.html b/examples/bench/mako/header.html new file mode 100644 index 0000000..e4f3382 --- /dev/null +++ b/examples/bench/mako/header.html @@ -0,0 +1,5 @@ +<div id="header"> + <h1>${title}</h1> +</div> + + diff --git a/examples/bench/mako/template.html b/examples/bench/mako/template.html new file mode 100644 index 0000000..8717fcc --- /dev/null +++ b/examples/bench/mako/template.html @@ -0,0 +1,32 @@ +<!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"> + <head> + <title>${title}</title> + </head> + <body> + +<%component name="greeting(name)"> + <p>hello ${name}!</p> +</%component> + + <%include file="header.html"/> + + + ${greeting(user)} + ${greeting('me')} + ${greeting('world')} + + <h2>Loop</h2> + % if list_items: + <ul> + % for list_item in list_items: + <li>${list_item}</li> + % endfor + </ul> + % endif + + <%include file="footer.html"/> + </body> +</html> diff --git a/examples/bench/myghty/base.myt b/examples/bench/myghty/base.myt new file mode 100644 index 0000000..af0474a --- /dev/null +++ b/examples/bench/myghty/base.myt @@ -0,0 +1,29 @@ +<!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"> +<%args scope="request"> + title +</%args> + +<& REQUEST:header &> + +<body> +<div id="header"> + <h1><% title %></h1> +</div> + +% m.call_next() + +<div id="footer"></div> + +</body> +</html> + + +<%method greeting> +<%args> + name +</%args> +Hello, <% name | h %> +</%method> diff --git a/examples/bench/myghty/template.myt b/examples/bench/myghty/template.myt new file mode 100644 index 0000000..db0cc4b --- /dev/null +++ b/examples/bench/myghty/template.myt @@ -0,0 +1,30 @@ +<%flags>inherit="base.myt"</%flags> +<%args> + title + items + user +</%args> + +<%method header> + <%args scope="request"> + title + </%args> +<head> + <title><% title %></title> +</head> +</%method> + + <div><& base.myt:greeting, name=user &></div> + <div><& base.myt:greeting, name="me"&></div> + <div><& base.myt:greeting, name="world" &></div> + + <h2>Loop</h2> +%if items: + <ul> +% for item in items: + <li><% item %></li> +% + </ul> +% + + |
