aboutsummaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2006-11-20 18:21:33 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2006-11-20 18:21:33 +0000
commit9cf1c1b3d33efc58e6c658c2331894862fe9edb0 (patch)
tree9d79bb1c89117123ed1abe2d07ee587f29bf66a4 /examples
parentc5eae67494631f904662235d9b6baf974482e466 (diff)
downloadexternal_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.py128
-rw-r--r--examples/bench/cheetah/footer.tmpl2
-rw-r--r--examples/bench/cheetah/header.tmpl5
-rw-r--r--examples/bench/cheetah/template.tmpl31
-rw-r--r--examples/bench/django/templates/base.html14
-rw-r--r--examples/bench/django/templates/template.html22
-rw-r--r--examples/bench/django/templatetags/__init__.py0
-rw-r--r--examples/bench/django/templatetags/bench.py8
-rw-r--r--examples/bench/genshi/base.html17
-rw-r--r--examples/bench/genshi/template.html24
-rw-r--r--examples/bench/kid/base.kid15
-rw-r--r--examples/bench/kid/template.kid22
-rw-r--r--examples/bench/mako/footer.html2
-rw-r--r--examples/bench/mako/header.html5
-rw-r--r--examples/bench/mako/template.html32
-rw-r--r--examples/bench/myghty/base.myt29
-rw-r--r--examples/bench/myghty/template.myt30
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>
+%
+
+