[Twisted-web] http://genshi.edgewall.org/wiki/GenshiPerformance

Manlio Perillo manlio_perillo at libero.it
Sat Apr 28 15:23:30 CDT 2007


I have found two simple benchmark on the genshi site.
The basic benchmark is not a good benchmark, since the tests are not all 
equivalent.

I have added a test for Nevow (the patch is attached).
Before sending the patch to the genshi developers, I want to be sure 
that the code is the best possible.

Here is the results:

basic
=====

Django: 1.35 ms
Cheetah: 0.64 ms
Nevow: 1.88 ms


bigtable
========

Djange template                               370.68 ms
Nevow                                         947.84 ms




Thanks and regards  Manlio Perillo
-------------- next part --------------
Index: bigtable.py
===================================================================
--- bigtable.py	(revisione 565)
+++ bigtable.py	(copia locale)
@@ -9,10 +9,14 @@
 import sys
 import timeit
 from StringIO import StringIO
-from genshi.builder import tag
-from genshi.template import MarkupTemplate
 
 try:
+    from genshi.builder import tag
+    from genshi.template import MarkupTemplate
+except ImportError:
+    MarkupTemplate = None
+
+try:
     from elementtree import ElementTree as et
 except ImportError:
     et = None
@@ -45,10 +49,16 @@
 except ImportError:
     MyghtyInterpreter = None
 
+try:
+    from nevow import inevow, rend, loaders
+except ImportError:
+    inevow = None
+
 table = [dict(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9,j=10)
           for x in range(1000)]
 
-genshi_tmpl = MarkupTemplate("""
+if MarkupTemplate:
+    genshi_tmpl = MarkupTemplate("""
 <table xmlns:py="http://genshi.edgewall.org/">
 <tr py:for="row in table">
 <td py:for="c in row.values()" py:content="c"/>
@@ -56,7 +66,7 @@
 </table>
 """)
 
-genshi_tmpl2 = MarkupTemplate("""
+    genshi_tmpl2 = MarkupTemplate("""
 <table xmlns:py="http://genshi.edgewall.org/">$table</table>
 """)
 
@@ -184,11 +194,44 @@
 </table>""")
         cs.render()
 
+if inevow:
+    class NevowPage(rend.Page):
+        docFactory = loaders.xmlstr("""
+<table xmlns:n="http://nevow.com/ns/nevow/0.1" n:render="table">
+  <tr n:pattern="row">
+    <td n:pattern="col"><n:slot name="item" /></td>
+  </tr>
+</table>""")
 
+        def render_table(self, ctx, data):
+            tag = ctx.tag
+            l = []
+            rowPattern = tag.patternGenerator('row')
+            
+            for row in table:
+                tr = rowPattern()
+                colPattern = tr.patternGenerator('col')
+                ll = []
+                
+                for col in row.values():
+                    td = colPattern()
+                    td.fillSlots('item', col)
+                    ll.append(td)
+
+                l.append(tr[ll])
+
+            return tag[l]
+
+    def test_nevow():
+        """Nevow"""
+        
+        NevowPage().renderSynchronously()
+
+
 def run(which=None, number=10):
     tests = ['test_builder', 'test_genshi', 'test_genshi_builder', 'test_myghty', 'test_kid',
              'test_kid_et', 'test_et', 'test_cet', 'test_clearsilver',
-             'test_django']
+             'test_django', 'test_nevow']
 
     if which:
         tests = filter(lambda n: n[5:] in which, tests)
Index: basic.py
===================================================================
--- basic.py	(revisione 565)
+++ basic.py	(copia locale)
@@ -4,7 +4,7 @@
 import sys
 import timeit
 
-__all__ = ['clearsilver', 'myghty', 'django', 'kid', 'genshi', 'cheetah']
+__all__ = ['clearsilver', 'myghty', 'django', 'kid', 'genshi', 'cheetah', 'nevow']
 
 def genshi(dirname, verbose=False):
     from genshi.template import TemplateLoader
@@ -105,11 +105,48 @@
     return render
 
 def nevow(dirname, verbose=False):
-    # FIXME: can't figure out the API
-    from nevow.loaders import xmlfile
-    template = xmlfile('template.xml', templateDir=dirname).load()
+    from nevow import rend, loaders
+
+
+    class Base(rend.Page):
+        docFactory = loaders.xmlfile('template.xhtml', templateDir=dirname)
+        template = None # The template to be used, in derived class
+        
+        def render_title(self, ctx, data):
+            return 'Just a test'
+
+        def macro_main(self, ctx):
+            return ctx.tag[
+                loaders.xmlfile(self.template, ignoreDocType=True, templateDir=dirname)
+                ]
+
+    class Main(Base):
+        template = 'main.xhtml'
+
+        def __init__(self, items):
+            self.items = items
+            
+        def render_loop(self, ctx, data):
+            tag = ctx.tag
+            if not self.items:
+                return tag
+
+            l = []
+            itemPattern = tag.patternGenerator('item')
+
+            for item in self.items:
+                li = itemPattern()
+                li.fillSlots('item', item)
+                l.append(li)
+
+            l[-1].attributes['class'] = 'last'
+            return tag[l]
+
+
+    root = Main(['Number %d' % num for num in range(1, 15)])
+    
     def render():
-        print template
+        return root.renderSynchronously()
 
     if verbose:
         print render()
Index: nevow/main.xhtml
===================================================================
--- nevow/main.xhtml	(revisione 0)
+++ nevow/main.xhtml	(revisione 0)
@@ -0,0 +1,10 @@
+<!DOCTYPE html
+          PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<n:invisible xmlns="http://www.w3.org/1999/xhtml"
+             xmlns:n="http://nevow.com/ns/nevow/0.1">
+  <h2>Loop</h2>
+  <ul n:render="loop">
+    <li n:pattern="item"><n:slot name="item" /></li>
+  </ul>
+</n:invisible>

Proprietà modificate su: nevow/main.xhtml
___________________________________________________________________
Nome: svn:keywords
   + Id

Index: nevow/template.xhtml
===================================================================
--- nevow/template.xhtml	(revisione 0)
+++ nevow/template.xhtml	(revisione 0)
@@ -0,0 +1,20 @@
+<!DOCTYPE html 
+          PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:n="http://nevow.com/ns/nevow/0.1" 
+      lang="en">
+  <head>
+    <title n:render="title" />
+  </head>
+
+  <body>
+    <div id="header">
+      <h1 n:render="title" />
+    </div>
+
+    <n:invisible n:macro="main" />
+
+    <div id="footer"></div>
+  </body>
+</html>

Proprietà modificate su: nevow/template.xhtml
___________________________________________________________________
Nome: svn:keywords
   + Id



More information about the Twisted-web mailing list