[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