# HG changeset patch
# User cmlenz
# Date 1152037162 0
# Node ID b387cf24d329c63e5d9bf614db08759d8c1d41cd
# Parent 950f75b72a1e7871cdd44897a25ff71e8aa99ebc
Add some simple benchmarks to compare performance against Clearsilver, Kid, Cheetah, and more soon.
diff --git a/examples/bench/cheetah/footer.tmpl b/examples/bench/cheetah/footer.tmpl
new file mode 100644
--- /dev/null
+++ b/examples/bench/cheetah/footer.tmpl
@@ -0,0 +1,2 @@
+
diff --git a/examples/bench/cheetah/header.tmpl b/examples/bench/cheetah/header.tmpl
new file mode 100644
--- /dev/null
+++ b/examples/bench/cheetah/header.tmpl
@@ -0,0 +1,3 @@
+
diff --git a/examples/bench/cheetah/template.tmpl b/examples/bench/cheetah/template.tmpl
new file mode 100644
--- /dev/null
+++ b/examples/bench/cheetah/template.tmpl
@@ -0,0 +1,22 @@
+
+
+
+ ${title}
+
+
+ #include "header.tmpl"
+
+ Loop
+ #if $items
+
+ #for $item in $items
+ - $item
+ #end for
+
+ #end if
+
+ #include "footer.tmpl"
+
+
diff --git a/examples/bench/clearsilver/footer.cs b/examples/bench/clearsilver/footer.cs
new file mode 100644
--- /dev/null
+++ b/examples/bench/clearsilver/footer.cs
@@ -0,0 +1,2 @@
+
diff --git a/examples/bench/clearsilver/header.cs b/examples/bench/clearsilver/header.cs
new file mode 100644
--- /dev/null
+++ b/examples/bench/clearsilver/header.cs
@@ -0,0 +1,3 @@
+
diff --git a/examples/bench/clearsilver/template.cs b/examples/bench/clearsilver/template.cs
new file mode 100644
--- /dev/null
+++ b/examples/bench/clearsilver/template.cs
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+ Loop
+
+
+
+
+
+
+
diff --git a/examples/bench/kid/base.kid b/examples/bench/kid/base.kid
new file mode 100644
--- /dev/null
+++ b/examples/bench/kid/base.kid
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/examples/bench/kid/header.kid b/examples/bench/kid/header.kid
new file mode 100644
--- /dev/null
+++ b/examples/bench/kid/header.kid
@@ -0,0 +1,6 @@
+
+
+
diff --git a/examples/bench/kid/template.kid b/examples/bench/kid/template.kid
new file mode 100644
--- /dev/null
+++ b/examples/bench/kid/template.kid
@@ -0,0 +1,21 @@
+
+
+
+ ${title}
+
+
+ ${header()}
+
+ Loop
+
+
+ ${footer()}
+
+
diff --git a/examples/bench/markup/footer.html b/examples/bench/markup/footer.html
new file mode 100644
--- /dev/null
+++ b/examples/bench/markup/footer.html
@@ -0,0 +1,2 @@
+
diff --git a/examples/bench/markup/header.html b/examples/bench/markup/header.html
new file mode 100644
--- /dev/null
+++ b/examples/bench/markup/header.html
@@ -0,0 +1,3 @@
+
diff --git a/examples/bench/markup/template.html b/examples/bench/markup/template.html
new file mode 100644
--- /dev/null
+++ b/examples/bench/markup/template.html
@@ -0,0 +1,21 @@
+
+
+
+ ${title}
+
+
+
+
+ Loop
+
+
+
+
+
diff --git a/examples/bench/run.py b/examples/bench/run.py
new file mode 100644
--- /dev/null
+++ b/examples/bench/run.py
@@ -0,0 +1,83 @@
+from cgi import escape
+from datetime import datetime, timedelta
+import os
+import sys
+
+def _measure_time(func, repeat=100):
+ times = []
+ for i in range(repeat):
+ start = datetime.now()
+ sys.stdout.write('.')
+ sys.stdout.flush()
+ func()
+ times.append(datetime.now() - start)
+
+ print
+ total_ms = sum([t.seconds * 1000 + t.microseconds for t in times])
+ print ' --> timing: %s (avg), %s (min), %s (max)' % (
+ timedelta(microseconds=total_ms / len(times)),
+ timedelta(microseconds=min([t.seconds * 1000 + t.microseconds for t in times])),
+ timedelta(microseconds=max([t.seconds * 1000 + t.microseconds for t in times])))
+
+def markup(dirname):
+ from markup.template import Context, TemplateLoader
+ loader = TemplateLoader([dirname], False)
+ template = loader.load('template.html')
+ def render():
+ ctxt = Context(title='Just a test',
+ items=['Number %d' % num for num in range(1, 15)])
+ template.generate(ctxt).render('html')
+ return render
+
+def cheetah(dirname):
+ # FIXME: infinite recursion somewhere... WTF?
+ 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
+
+def clearsilver(dirname):
+ 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')
+ return render
+
+def kid(dirname):
+ 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
+
+def main():
+ basepath = os.path.abspath(os.path.dirname(__file__))
+ for engine in ('markup', 'clearsilver', 'kid'):
+ dirname = os.path.join(basepath, engine)
+ print '%s:' % engine.capitalize()
+ func = globals()[engine](dirname)
+ _measure_time(func)
+ print
+
+if __name__ == '__main__':
+ main()