cmlenz@97: # -*- encoding: utf-8 -*- cmlenz@97: # Template language benchmarks cmlenz@97: # cmlenz@97: # Objective: Generate a 1000x10 HTML table as fast as possible. cmlenz@97: # cmlenz@97: # Author: Jonas Borgström cmlenz@97: cmlenz@117: import cgi cmlenz@97: import sys cmlenz@97: import timeit cmlenz@97: cmlenz@97: import cElementTree as cet cmlenz@97: from elementtree import ElementTree as et cmlenz@97: import kid cmlenz@97: from markup.builder import tag cmlenz@97: from markup.template import Context, Template cmlenz@97: import neo_cgi cmlenz@97: import neo_cs cmlenz@97: import neo_util cmlenz@97: cmlenz@97: table = [dict(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9,j=10) cmlenz@97: for x in range(1000)] cmlenz@97: cmlenz@97: markup_tmpl = Template(""" cmlenz@97: cmlenz@97: cmlenz@97: cmlenz@97:
cmlenz@97:
cmlenz@97: """) cmlenz@97: cmlenz@97: markup_tmpl2 = Template(""" cmlenz@97: $table
cmlenz@97: """) cmlenz@97: cmlenz@97: kid_tmpl = kid.Template(""" cmlenz@97: cmlenz@97: cmlenz@97: cmlenz@97:
cmlenz@97:
cmlenz@97: """) cmlenz@97: cmlenz@97: kid_tmpl2 = kid.Template(""" cmlenz@97: $table cmlenz@97: """) cmlenz@97: cmlenz@97: cmlenz@97: def test_markup(): cmlenz@97: """Markup template""" cmlenz@97: ctxt = Context(table=table) cmlenz@97: stream = markup_tmpl.generate(ctxt) cmlenz@123: stream.render('html', strip_whitespace=False) cmlenz@97: cmlenz@97: def test_markup_builder(): cmlenz@97: """Markup template + tag builder""" cmlenz@97: stream = tag.TABLE([ cmlenz@97: tag.tr([tag.td(c) for c in row.values()]) cmlenz@97: for row in table cmlenz@97: ]).generate() cmlenz@97: ctxt = Context(table=stream) cmlenz@97: stream = markup_tmpl2.generate(ctxt) cmlenz@123: stream.render('html', strip_whitespace=False) cmlenz@97: cmlenz@97: def test_builder(): cmlenz@97: """Markup tag builder""" cmlenz@97: stream = tag.TABLE([ cmlenz@97: tag.tr([ cmlenz@97: tag.td(c) for c in row.values() cmlenz@97: ]) cmlenz@97: for row in table cmlenz@97: ]).generate() cmlenz@123: stream.render('html', strip_whitespace=False) cmlenz@97: cmlenz@97: def test_kid(): cmlenz@97: """Kid template""" cmlenz@97: kid_tmpl.table = table cmlenz@97: kid_tmpl.serialize(output='html') cmlenz@97: cmlenz@97: def test_kid_et(): cmlenz@97: """Kid template + cElementTree""" cmlenz@97: _table = cet.Element('table') cmlenz@97: for row in table: cmlenz@97: td = cet.SubElement(_table, 'tr') cmlenz@97: for c in row.values(): cmlenz@97: cet.SubElement(td, 'td').text=str(c) cmlenz@97: kid_tmpl2.table = _table cmlenz@97: kid_tmpl2.serialize(output='html') cmlenz@97: cmlenz@97: def test_et(): cmlenz@97: """ElementTree""" cmlenz@97: _table = et.Element('table') cmlenz@97: for row in table: cmlenz@97: tr = et.SubElement(_table, 'tr') cmlenz@97: for c in row.values(): cmlenz@97: et.SubElement(tr, 'td').text=str(c) cmlenz@97: et.tostring(_table) cmlenz@97: cmlenz@97: def test_cet(): cmlenz@97: """cElementTree""" cmlenz@97: _table = cet.Element('table') cmlenz@97: for row in table: cmlenz@97: tr = cet.SubElement(_table, 'tr') cmlenz@97: for c in row.values(): cmlenz@97: cet.SubElement(tr, 'td').text=str(c) cmlenz@97: cet.tostring(_table) cmlenz@97: cmlenz@97: def test_clearsilver(): cmlenz@97: """ClearSilver""" cmlenz@97: hdf = neo_util.HDF() cmlenz@97: for i, row in enumerate(table): cmlenz@97: for j, c in enumerate(row.values()): cmlenz@117: hdf.setValue("rows.%d.cell.%d" % (i, j), cgi.escape(str(c))) cmlenz@97: cmlenz@97: cs = neo_cs.CS(hdf) cmlenz@97: cs.parseStr(""" cmlenz@97: cmlenz@97:
""") cmlenz@97: cs.render() cmlenz@97: cmlenz@97: cmlenz@97: def run(which=None, number=10): cmlenz@97: tests = ['test_builder', 'test_markup', 'test_markup_builder', 'test_kid', cmlenz@97: 'test_kid_et', 'test_et', 'test_cet', 'test_clearsilver'] cmlenz@97: if which: cmlenz@97: tests = filter(lambda n: n[5:] in which, tests) cmlenz@97: cmlenz@97: for test in tests: cmlenz@97: t = timeit.Timer(setup='from __main__ import %s;' % test, cmlenz@97: stmt='%s()' % test) cmlenz@97: time = t.timeit(number=number) / number cmlenz@97: cmlenz@97: print '%-35s %8.2f ms' % (getattr(sys.modules[__name__], test).__doc__, cmlenz@97: 1000 * time) cmlenz@97: cmlenz@97: cmlenz@97: if __name__ == '__main__': cmlenz@97: which = [arg for arg in sys.argv[1:] if arg[0] != '-'] cmlenz@97: cmlenz@97: if '-p' in sys.argv: cmlenz@97: import hotshot, hotshot.stats cmlenz@97: prof = hotshot.Profile("template.prof") cmlenz@97: benchtime = prof.runcall(run, which, number=1) cmlenz@97: stats = hotshot.stats.load("template.prof") cmlenz@97: stats.strip_dirs() cmlenz@97: stats.sort_stats('time', 'calls') cmlenz@97: stats.print_stats() cmlenz@97: else: cmlenz@97: run(which)