Skip to content

Instantly share code, notes, and snippets.

@mithrandi
Last active April 17, 2016 11:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mithrandi/54845e061217b98cdf4dd7700277f6a2 to your computer and use it in GitHub Desktop.
Save mithrandi/54845e061217b98cdf4dd7700277f6a2 to your computer and use it in GitHub Desktop.
twisted.web.template / nevow.page optimization stuff
import time
from StringIO import StringIO
from nevow import tags
from nevow.context import WovenContext
from nevow.flat.twist import deferflatten
from nevow.loaders import stan, xmlstr
from nevow.page import Element, renderer
try:
import __pypy__
PYPY = True
except ImportError:
PYPY = False
class Elem(Element):
docFactory = xmlstr(
"""
<div xmlns:nevow="http://nevow.com/ns/nevow/0.1">
""" + "A" * 1000 + """
<div nevow:render="r" />
<div nevow:render="r2" />
<div nevow:render="r3">
<nevow:slot name="meep" />
</div>
</div>
""")
def __init__(self, children=[]):
super(Elem, self).__init__()
self.children = children
@renderer
def r(self, req, tag):
return tag(attr=u'value')[
[self.children,
u'hi mom!']]
@renderer
def r2(self, req, tag):
return tags.div(attr=u'value')[u'foo']
@renderer
def r3(self, req, tag):
return tag.fillSlots(
u'meep',
(u'slotvalue', u'42', 'bar', tags.div(attr=u'value')[u'meep']))
def render():
child = Elem()
for _ in xrange(20):
child = Elem([child])
root = stan([child] * 10).load()
out = StringIO()
deferflatten(
root, WovenContext(tag=tags.invisible[root]), out.write)
def bench(f, calibration_time=1.0, warmup=1000):
if PYPY:
for _ in xrange(warmup):
f()
start = time.time()
n = 0
while time.time() < start + calibration_time:
f()
n += 1
iterations = int(n * 5 / calibration_time)
start = time.time()
for _ in xrange(iterations):
f()
end = time.time()
return (
(end - start) / 5.0,
(end - start) / iterations * 1000,
iterations / (end - start))
if __name__ == '__main__':
print bench(render)
import time
from StringIO import StringIO
from twisted.web.template import (
Element, flatten, renderer, TagLoader, tags, XMLString)
try:
import __pypy__
PYPY = True
except ImportError:
PYPY = False
class Elem(Element):
loader = XMLString(
"""
<div xmlns:t="http://twistedmatrix.com/ns/twisted.web.template/0.1">
""" + "A" * 1000 + """
<div t:render="r" />
<div t:render="r2" />
<div t:render="r3">
<t:slot name="meep" />
</div>
</div>
""")
def __init__(self, children=[]):
super(Elem, self).__init__()
self.children = children
@renderer
def r(self, req, tag):
return tag(
[self.children,
u'hi mom!'],
attr=u'value')
@renderer
def r2(self, req, tag):
return tags.div(u'foo', attr=u'value')
@renderer
def r3(self, req, tag):
return tag.fillSlots(
meep=(u'slotvalue',
u'42',
'bar',
tags.div(u'meep', attr=u'value')))
def render():
child = Elem()
for _ in xrange(20):
child = Elem([child])
root = TagLoader([child] * 10).load()
out = StringIO()
flatten(None, root, out.write)
def bench(f, calibration_time=1.0, warmup=1000):
if PYPY:
for _ in xrange(warmup):
f()
start = time.time()
n = 0
while time.time() < start + calibration_time:
f()
n += 1
iterations = int(n * 5 / calibration_time)
start = time.time()
for _ in xrange(iterations):
f()
end = time.time()
return (
(end - start) / 5.0,
(end - start) / iterations * 1000,
iterations / (end - start))
if __name__ == '__main__':
print bench(render)

+-------------------------------+-------------+--------------------+---------+ | Renders / second | Unoptimized | Write optimization | Speedup | +==============+================+=============+====================+=========+ | nevow.page | PyPy 5.0.1 | 156.330 | 246.745 | 57.8% | | +----------------+-------------+--------------------+---------+ | | CPython 2.7.11 | 23.805 | 25.468 | 6.9% | +--------------+----------------+-------------+--------------------+---------+ | t.w.template | PyPy 5.0.1 | 119.027 | 166.140 | 39.6% | | +----------------+-------------+--------------------+---------+ | | CPython 2.7.11 | 16.089 | 18.209 | 13.1% | +--------------+----------------+-------------+--------------------+---------+

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment