[Checkins] SVN: z3c.form/trunk/ Adding benchmark suite to test performance between z3c.pt and zope.pagetemplate.
Malthe Borch
mborch at gmail.com
Tue Sep 9 10:14:59 EDT 2008
Log message for revision 91000:
Adding benchmark suite to test performance between z3c.pt and zope.pagetemplate.
Changed:
U z3c.form/trunk/CHANGES.txt
A z3c.form/trunk/benchmark/
A z3c.form/trunk/benchmark/benchmark/
A z3c.form/trunk/benchmark/benchmark/__init__.py
A z3c.form/trunk/benchmark/benchmark/tests.py
A z3c.form/trunk/benchmark/setup.py
U z3c.form/trunk/buildout.cfg
-=-
Modified: z3c.form/trunk/CHANGES.txt
===================================================================
--- z3c.form/trunk/CHANGES.txt 2008-09-09 13:39:44 UTC (rev 90999)
+++ z3c.form/trunk/CHANGES.txt 2008-09-09 14:14:58 UTC (rev 91000)
@@ -5,8 +5,11 @@
Version 2.0.0 (2008-??-??)
--------------------------
+- Feature: Added benchmarking suite demonstrating performance gain
+ when using ``z3c.pt``.
+
- Feature: Added support for ``z3c.pt``. Usage is switched on via the
- "PREFER_Z3C_PT" environment variable. [malthe]
+ "PREFER_Z3C_PT" environment variable.
- Refactoring: Templates now declare XML namespaces.
Added: z3c.form/trunk/benchmark/benchmark/__init__.py
===================================================================
Added: z3c.form/trunk/benchmark/benchmark/tests.py
===================================================================
--- z3c.form/trunk/benchmark/benchmark/tests.py (rev 0)
+++ z3c.form/trunk/benchmark/benchmark/tests.py 2008-09-09 14:14:58 UTC (rev 91000)
@@ -0,0 +1,169 @@
+import os
+import unittest
+import time
+import sys
+import random
+
+reload(sys)
+sys.setdefaultencoding('utf-8')
+
+import zope.configuration.xmlconfig
+import z3c.pt
+
+from zope import interface
+from zope import component
+from zope import schema
+
+from zope.schema.interfaces import IVocabularyFactory
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from z3c.pt.pagetemplate import ViewPageTemplateFile as z3cViewPageTemplateFile
+
+from z3c.form import form
+from z3c.form import term
+from z3c.form import interfaces
+from z3c.form import field
+from z3c.form import config
+from z3c.form import tests
+from z3c.form import testing
+from z3c.form import viewpagetemplatefile as vptf
+
+def benchmark(title):
+ def decorator(f):
+ def wrapper(*args):
+ print "===============================\n %s\n===============================" % title
+ return f(*args)
+ return wrapper
+ return decorator
+
+def timing(func, *args, **kwargs):
+ t1 = t2 = time.time()
+ i = 0
+ while t2 - t1 < 3:
+ func(*args, **kwargs)
+ i += 1
+ t2 = time.time()
+ return 100*(t2-t1)/i
+
+class ISmallForm(interface.Interface):
+ name = schema.TextLine(
+ title=u"Name",
+ description=u"Please enter your first and last name.")
+
+ address = schema.TextLine(
+ title=u"Address",
+ description=u"Please enter a valid address.")
+
+class ILargeDataSetsForm(interface.Interface):
+ lucky_numer = schema.Choice(
+ range(500),
+ title=u"Lucky number",
+ description=u"Choose your lucky number.")
+
+ favorite_letters = schema.Set(
+ title=u"Favorite letter",
+ description=u"Choose your favorite letter.",
+ value_type=schema.Choice(
+ ["".join(chr(random.randint(65, 90)) for i in range(10))]
+ ))
+
+def build_many_fields(size):
+ for i in range(size):
+ name = "".join(chr(random.randint(65, 90)) for i in range(10))
+ yield schema.TextLine(
+ __name__=name,
+ description=u"This field renders %s" % name,
+ title=u"Title of %s" % name.capitalize())
+
+IManyFields = tuple(build_many_fields(500))
+
+class BaseTestCase(unittest.TestCase):
+ def _setUp(suite):
+ testing.setUp(suite)
+ testing.setupFormDefaults()
+ zope.configuration.xmlconfig.XMLConfig('configure.zcml', z3c.pt)()
+ component.provideAdapter(term.CollectionTerms)
+
+ def _tearDown(suite):
+ testing.tearDown(suite)
+
+class BenchmarkTestCase(BaseTestCase):
+ def simple_form(self, cls, iface):
+ class SimpleForm(form.AddForm):
+ fields = field.Fields(*(isinstance(iface, tuple) and iface or (iface,)))
+ render = cls(
+ os.path.join(tests.__path__[0], 'simple_edit.pt'))
+ return SimpleForm
+
+ @benchmark(u"Small add-form (update/render)")
+ def testSmallForm(self):
+ context = object()
+ request = testing.TestRequest()
+
+ f_z3c = self.simple_form(
+ z3cViewPageTemplateFile, ISmallForm)(context, request)
+ f_zope = self.simple_form(
+ ViewPageTemplateFile, ISmallForm)(context, request)
+
+ config.PREFER_Z3C_PT = True
+ t_z3c = self.benchmark(f_z3c, f_z3c)
+ config.PREFER_Z3C_PT = False
+ t_zope = self.benchmark(f_zope, f_zope)
+
+ print "z3c.pt: %.3f" % t_z3c
+ print "zope.pagetemplate: %.3f" % t_zope
+ print " %.2fX" % (t_zope/t_z3c)
+
+ @benchmark(u"Large data sets (update/render)")
+ def testLargeDataSets(self):
+ context = object()
+ request = testing.TestRequest()
+
+ f_z3c = self.simple_form(
+ z3cViewPageTemplateFile, ILargeDataSetsForm)(context, request)
+ f_zope = self.simple_form(
+ ViewPageTemplateFile, ILargeDataSetsForm)(context, request)
+
+ config.PREFER_Z3C_PT = True
+ t_z3c = self.benchmark(f_z3c, f_z3c)
+ config.PREFER_Z3C_PT = False
+ t_zope = self.benchmark(f_zope, f_zope)
+
+ print "z3c.pt: %.3f" % t_z3c
+ print "zope.pagetemplate: %.3f" % t_zope
+ print " %.2fX" % (t_zope/t_z3c)
+
+ @benchmark(u"Many fields (update/render)")
+ def testManyFields(self):
+ context = object()
+ request = testing.TestRequest()
+
+ f_z3c = self.simple_form(
+ z3cViewPageTemplateFile, IManyFields)(context, request)
+ f_zope = self.simple_form(
+ ViewPageTemplateFile, IManyFields)(context, request)
+
+ config.PREFER_Z3C_PT = True
+ t_z3c = self.benchmark(f_z3c, f_z3c)
+ config.PREFER_Z3C_PT = False
+ t_zope = self.benchmark(f_zope, f_zope)
+
+ print "z3c.pt: %.3f" % t_z3c
+ print "zope.pagetemplate: %.3f" % t_zope
+ print " %.2fX" % (t_zope/t_z3c)
+
+ def benchmark(self, prep, func, *args):
+ reload(vptf)
+ self._setUp()
+ prep()
+ t = timing(func, *args)
+ self._tearDown()
+ return t
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(BenchmarkTestCase),
+ ))
+
+if __name__ == "__main__":
+ unittest.main(defaultTest="test_suite")
+
Added: z3c.form/trunk/benchmark/setup.py
===================================================================
--- z3c.form/trunk/benchmark/setup.py (rev 0)
+++ z3c.form/trunk/benchmark/setup.py 2008-09-09 14:14:58 UTC (rev 91000)
@@ -0,0 +1,24 @@
+from setuptools import setup, find_packages
+
+version = '0.1'
+
+setup(name='benchmark',
+ version=version,
+ description="Benchmark-suite for z3c.form.",
+ long_description="""\
+ """,
+ keywords='',
+ author = "Malthe Borch and the Zope Community",
+ author_email = "zope-dev at zope.org",
+ url='',
+ license='',
+ packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
+ include_package_data=True,
+ zip_safe=False,
+ install_requires=[
+ 'zope.app.pagetemplate',
+ 'zope.schema',
+ 'z3c.form',
+ 'z3c.pt',
+ ],
+ )
Modified: z3c.form/trunk/buildout.cfg
===================================================================
--- z3c.form/trunk/buildout.cfg 2008-09-09 13:39:44 UTC (rev 90999)
+++ z3c.form/trunk/buildout.cfg 2008-09-09 14:14:58 UTC (rev 91000)
@@ -1,6 +1,6 @@
[buildout]
-develop = .
-parts = test checker coverage-test coverage-report i18n
+develop = . benchmark
+parts = test checker coverage-test coverage-report i18n benchmark
index = http://download.zope.org/zope3.4
versions = versions
@@ -47,3 +47,14 @@
<include package="zope.i18n" file="meta.zcml" />
<include package="z3c.form" file="meta.zcml" />
<include package="z3c.form" />
+
+[benchmark]
+recipe = zc.recipe.testrunner
+environment = benchmark-environment
+eggs =
+ z3c.form [test]
+ benchmark
+
+[benchmark-environment]
+Z3C_PT_DEBUG = False
+Z3C_PT_CACHE = True
\ No newline at end of file
More information about the Checkins
mailing list