comparison examples/bench/basic.py @ 97:ff19219485cc trunk

Add benchmark that builds a large HTML table using different templating techniques (provided by Jonas).
author cmlenz
date Fri, 21 Jul 2006 11:56:01 +0000
parents
children 0f246a30d3a7
comparison
equal deleted inserted replaced
96:fa08aef181a2 97:ff19219485cc
1 from cgi import escape
2 import os
3 from StringIO import StringIO
4 import sys
5 import timeit
6
7 __all__ = ['clearsilver', 'django', 'kid', 'markup', 'simpletal']
8
9 def markup(dirname, verbose=False):
10 from markup.template import Context, TemplateLoader
11 loader = TemplateLoader([dirname], auto_reload=False)
12 template = loader.load('template.html')
13 def render():
14 ctxt = Context(title='Just a test', user='joe',
15 items=['Number %d' % num for num in range(1, 15)])
16 return template.generate(ctxt).render('html')
17
18 if verbose:
19 print render()
20 return render
21
22 def cheetah(dirname, verbose=False):
23 # FIXME: infinite recursion somewhere... WTF?
24 from Cheetah.Template import Template
25 class MyTemplate(Template):
26 def serverSidePath(self, path): return os.path.join(dirname, path)
27 filename = os.path.join(dirname, 'template.tmpl')
28 template = MyTemplate(file=filename)
29
30 def render():
31 template = MyTemplate(file=filename,
32 searchList=[{'title': 'Just a test', 'user': 'joe',
33 'items': [u'Number %d' % num for num in range(1, 15)]}])
34 return template.respond()
35
36 if verbose:
37 print render()
38 return render
39
40 def clearsilver(dirname, verbose=False):
41 import neo_cgi
42 neo_cgi.update()
43 import neo_util
44 import neo_cs
45 def render():
46 hdf = neo_util.HDF()
47 hdf.setValue('hdf.loadpaths.0', dirname)
48 hdf.setValue('title', escape('Just a test'))
49 hdf.setValue('user', escape('joe'))
50 for num in range(1, 15):
51 hdf.setValue('items.%d' % (num - 1), escape('Number %d' % num))
52 cs = neo_cs.CS(hdf)
53 cs.parseFile('template.cs')
54 return cs.render()
55
56 if verbose:
57 print render()
58 return render
59
60 def django(dirname, verbose=False):
61 from django.conf import settings
62 settings.configure(TEMPLATE_DIRS=[os.path.join(dirname, 'templates')])
63 from django import template, templatetags
64 from django.template import loader
65 templatetags.__path__.append(os.path.join(dirname, 'templatetags'))
66 tmpl = loader.get_template('template.html')
67
68 def render():
69 data = {'title': 'Just a test', 'user': 'joe',
70 'items': ['Number %d' % num for num in range(1, 15)]}
71 return tmpl.render(template.Context(data))
72
73 if verbose:
74 print render()
75 return render
76
77 def kid(dirname, verbose=False):
78 import kid
79 kid.path = kid.TemplatePath([dirname])
80 template = kid.Template(file='template.kid')
81 def render():
82 template = kid.Template(file='template.kid',
83 title='Just a test', user='joe',
84 items=['Number %d' % num for num in range(1, 15)])
85 return template.serialize(output='xhtml')
86
87 if verbose:
88 print render()
89 return render
90
91 def nevow(dirname, verbose=False):
92 # FIXME: can't figure out the API
93 from nevow.loaders import xmlfile
94 template = xmlfile('template.xml', templateDir=dirname).load()
95 def render():
96 print template
97
98 if verbose:
99 print render()
100 return render
101
102 def simpletal(dirname, verbose=False):
103 from simpletal import simpleTAL, simpleTALES
104 fileobj = open(os.path.join(dirname, 'base.html'))
105 base = simpleTAL.compileHTMLTemplate(fileobj)
106 fileobj.close()
107 fileobj = open(os.path.join(dirname, 'template.html'))
108 template = simpleTAL.compileHTMLTemplate(fileobj)
109 fileobj.close()
110 def render():
111 ctxt = simpleTALES.Context()
112 ctxt.addGlobal('base', base)
113 ctxt.addGlobal('title', 'Just a test')
114 ctxt.addGlobal('user', 'joe')
115 ctxt.addGlobal('items', ['Number %d' % num for num in range(1, 15)])
116 buf = StringIO()
117 template.expand(ctxt, buf)
118 return buf.getvalue()
119
120 if verbose:
121 print render()
122 return render
123
124 def run(engines, verbose=False):
125 basepath = os.path.abspath(os.path.dirname(__file__))
126 for engine in engines:
127 dirname = os.path.join(basepath, engine)
128 if verbose:
129 print '%s:' % engine.capitalize()
130 print '--------------------------------------------------------'
131 else:
132 print '%s:' % engine.capitalize(),
133 t = timeit.Timer(setup='from __main__ import %s; render = %s("%s", %s)'
134 % (engine, engine, dirname, verbose),
135 stmt='render()')
136 time = t.timeit(number=2000) / 2000
137 if verbose:
138 print '--------------------------------------------------------'
139 print '%.2f ms' % (1000 * time)
140 if verbose:
141 print '--------------------------------------------------------'
142
143
144 if __name__ == '__main__':
145 engines = [arg for arg in sys.argv[1:] if arg[0] != '-']
146 if not engines:
147 engines = __all__
148
149 verbose = '-v' in sys.argv
150
151 if '-p' in sys.argv:
152 import hotshot, hotshot.stats
153 prof = hotshot.Profile("template.prof")
154 benchtime = prof.runcall(run, engines, verbose=verbose)
155 stats = hotshot.stats.load("template.prof")
156 stats.strip_dirs()
157 stats.sort_stats('time', 'calls')
158 stats.print_stats()
159 else:
160 run(engines, verbose=verbose)
Copyright (C) 2012-2017 Edgewall Software