├── README ├── servers ├── __init__.py ├── gev.py ├── bot.py ├── torn.py ├── cyc.py ├── fla.py └── pyr.py ├── rqs.png ├── time.png ├── fix.py ├── plots.R ├── setup.py ├── runwsgi.py ├── runbench.py ├── pypy-results.txt └── cpy-results.txt /README: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /servers/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rqs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamescasbon/pypy-web-benchmarks/HEAD/rqs.png -------------------------------------------------------------------------------- /time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamescasbon/pypy-web-benchmarks/HEAD/time.png -------------------------------------------------------------------------------- /fix.py: -------------------------------------------------------------------------------- 1 | import redis 2 | import random 3 | 4 | 5 | r = redis.StrictRedis(host='localhost', port=6379, db=0) 6 | 7 | 8 | r.set('counter', 0) 9 | 10 | page = ''.join([random.choice('GATC') for _ in range(2000)]) 11 | 12 | r.set('page', page) 13 | 14 | 15 | -------------------------------------------------------------------------------- /servers/gev.py: -------------------------------------------------------------------------------- 1 | from gevent import wsgi 2 | 3 | class WebServer(object): 4 | def application(self, environ, start_response): 5 | start_response("200 OK", []) 6 | return ["Hello world!"] 7 | 8 | if __name__ == "__main__": 9 | app = WebServer() 10 | wsgi.WSGIServer(('', 8000), app.application, backlog=1024, log=None).serve_forever() 11 | 12 | -------------------------------------------------------------------------------- /servers/bot.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from bottle import route, run 3 | import bottle 4 | from bottle_redis import RedisPlugin 5 | 6 | app = bottle.Bottle() 7 | plugin = RedisPlugin(host='localhost') 8 | app.install(plugin) 9 | 10 | if len(sys.argv) < 2: 11 | server = 'tornado' 12 | else: 13 | server = sys.argv[1] 14 | 15 | 16 | @app.route('/') 17 | def stream(rdb): 18 | x = rdb.incr('counter') 19 | p = rdb.get('page') 20 | yield 'hello world! %s\n' % x 21 | yield p 22 | 23 | if __name__ == '__main__': 24 | run(app, host='0.0.0.0', port=8000, server=server, quiet=True) 25 | 26 | 27 | -------------------------------------------------------------------------------- /servers/torn.py: -------------------------------------------------------------------------------- 1 | import tornado.ioloop 2 | import tornado.web 3 | import redis 4 | 5 | pool = redis.ConnectionPool(host='localhost', port=6379, db=0) 6 | 7 | class MainHandler(tornado.web.RequestHandler): 8 | def get(self): 9 | r = redis.Redis(connection_pool=pool) 10 | x = r.incr('counter') 11 | self.write("Hello, world %s\n" % x) 12 | self.write(r.get('page')) 13 | 14 | application = tornado.web.Application([ 15 | (r"/", MainHandler), 16 | ]) 17 | 18 | if __name__ == "__main__": 19 | application.listen(8000) 20 | tornado.ioloop.IOLoop.instance().start() 21 | -------------------------------------------------------------------------------- /plots.R: -------------------------------------------------------------------------------- 1 | library('ggplot2') 2 | 3 | df = rbind( read.csv('pypy-results.txt', sep='\t'), read.csv('cpy-results.txt', sep='\t') ) 4 | df = subset(df, rep==2) 5 | 6 | 7 | 8 | 9 | ggplot(subset(df, host!='paste') , aes(x=conc, y=reqs_per_sec, colour=name, line=pypy)) 10 | last_plot() + geom_line() + facet_wrap(~host) + xlim(0,256) + xlab('Concurrent requests') + ylab('Requests per second') 11 | ggsave('rqs.png') 12 | 13 | df$reqs_per_sec = NULL 14 | 15 | dfm = melt(df, id.vars=c('pypy', 'name', 'host', 'conc', 'rep')) 16 | dfm = subset(dfm, variable!='reqs_per_sec') 17 | 18 | 19 | ggplot(dfm, aes(x=conc, y=value, colour=variable, line=pypy)) + geom_line() + facet_wrap(name~host) + ylim(0,10000) + scale_x_log2() + scale_y_log2() 20 | ggsave('time.png') 21 | 22 | 23 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | """ 2 | It's almost impossible to get an install that works automatically for this test. 3 | However, this gets you pretty fat 4 | 5 | Ad-hoc customisations: 6 | 7 | * bottle-redis needs a connection pool (see my pull request #11) 8 | * pypy needs to disable twisted's extensions when installing 9 | * eventlet: pypy needs --without-greenlet 10 | 11 | gevent should be 1.0 beta. 12 | 13 | """ 14 | from setuptools import setup 15 | import sys 16 | 17 | is_pypy = hasattr(sys, 'pypy_version_info') 18 | 19 | extras = [] 20 | if not is_pypy: 21 | extras.extend(['eventlet', 'cython']) 22 | 23 | setup( 24 | name='webbench', 25 | version='0.0.1', 26 | install_requires=['tornado', 'twisted', 'cyclone', 27 | 'flask', 'bottle', 'bottle-redis', 'redis', 28 | 'rocket', 'paste', 'pyramid', 'eventlet' 29 | ] + extras, 30 | ) 31 | 32 | -------------------------------------------------------------------------------- /servers/cyc.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import cyclone.web 3 | import cyclone.redis 4 | from twisted.python import log 5 | from twisted.internet import reactor 6 | from twisted.internet import defer 7 | 8 | class IndexHandler(cyclone.web.RequestHandler): 9 | 10 | @defer.inlineCallbacks 11 | def get(self): 12 | db = self.settings.db 13 | x = yield db.incr('counter') 14 | self.write("hello world %s\n" % x) 15 | p = yield db.get('page') 16 | self.write(p) 17 | 18 | 19 | class Application(cyclone.web.Application): 20 | def __init__(self): 21 | handlers = [ 22 | (r"/", IndexHandler), 23 | ] 24 | settings = dict( 25 | db = cyclone.redis.lazyConnectionPool("127.0.0.1", 6379,0, 10) 26 | ) 27 | 28 | cyclone.web.Application.__init__(self, 29 | handlers, **settings) 30 | 31 | if __name__ == "__main__": 32 | #log.startLogging(sys.stdout) 33 | reactor.listenTCP(8000, Application()) 34 | reactor.run() 35 | 36 | -------------------------------------------------------------------------------- /servers/fla.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from flask import Flask 3 | from tornado.wsgi import WSGIContainer 4 | from tornado.httpserver import HTTPServer 5 | from tornado.ioloop import IOLoop 6 | import redis 7 | 8 | app = Flask(__name__) 9 | 10 | 11 | redisdb = redis.ConnectionPool(host='localhost') 12 | 13 | 14 | @app.route("/") 15 | def hello(): 16 | db = redis.Redis(connection_pool=redisdb) 17 | x = db.incr('counter') 18 | p = db.get('page') 19 | return "Hello World! %s\n%s" % (x, p) 20 | 21 | 22 | 23 | if len(sys.argv) < 2: 24 | server = 'tornado' 25 | else: 26 | server = sys.argv[1] 27 | 28 | 29 | if __name__ == "__main__": 30 | if server == 'gevent': 31 | from gevent.wsgi import WSGIServer 32 | http_server = WSGIServer(('', 8000), app, log=None) 33 | http_server.serve_forever() 34 | 35 | elif server == 'tornado': 36 | http_server = HTTPServer(WSGIContainer(app)) 37 | http_server.listen(8000) 38 | IOLoop.instance().start() 39 | else: 40 | raise Exception('wat') 41 | -------------------------------------------------------------------------------- /servers/pyr.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from wsgiref.simple_server import make_server 3 | from pyramid.config import Configurator 4 | from pyramid.response import Response 5 | from tornado.wsgi import WSGIContainer 6 | from tornado.httpserver import HTTPServer 7 | from tornado.ioloop import IOLoop 8 | import redis 9 | 10 | redisdb = redis.ConnectionPool(host='localhost') 11 | 12 | 13 | def hello_world(request): 14 | db = redis.Redis(connection_pool=redisdb) 15 | x = db.incr('counter') 16 | p = db.get('page') 17 | 18 | return Response('Hello world! %s\n %s' %(x,p)) 19 | 20 | if len(sys.argv) < 2: 21 | server = 'tornado' 22 | else: 23 | server = sys.argv[1] 24 | 25 | 26 | config = Configurator() 27 | config.add_view(hello_world) 28 | app = config.make_wsgi_app() 29 | 30 | 31 | if __name__ == '__main__': 32 | 33 | if server == 'gevent': 34 | from gevent.wsgi import WSGIServer 35 | http_server = WSGIServer(('', 8000), app, log=None) 36 | http_server.serve_forever() 37 | 38 | elif server == 'tornado': 39 | http_server = HTTPServer(WSGIContainer(app)) 40 | http_server.listen(8000) 41 | IOLoop.instance().start() 42 | else: 43 | raise Exception('wat') 44 | 45 | -------------------------------------------------------------------------------- /runwsgi.py: -------------------------------------------------------------------------------- 1 | PORT = 8000 2 | HOST = '0.0.0.0' 3 | 4 | import sys 5 | 6 | server, appname = sys.argv[1:] 7 | 8 | if appname == 'bottle': 9 | from servers.bot import app 10 | elif appname == 'flask': 11 | from servers.fla import app 12 | elif appname == 'pyramid': 13 | from servers.pyr import app 14 | 15 | 16 | if __name__ == "__main__": 17 | if server == 'gevent': 18 | from gevent.wsgi import WSGIServer 19 | http_server = WSGIServer((HOST, PORT), app, log=None) 20 | http_server.serve_forever() 21 | 22 | elif server == 'tornado': 23 | from tornado.wsgi import WSGIContainer 24 | from tornado.httpserver import HTTPServer 25 | from tornado.ioloop import IOLoop 26 | 27 | http_server = HTTPServer(WSGIContainer(app)) 28 | http_server.listen(PORT) 29 | IOLoop.instance().start() 30 | 31 | elif server == 'eventlet': 32 | from eventlet import wsgi 33 | import eventlet 34 | wsgi.server(eventlet.listen(('127.0.0.1', PORT), backlog=500), app, log=file('/dev/null', 'w')) 35 | 36 | elif server == 'cherrypy': 37 | from cherrypy import wsgiserver 38 | server = wsgiserver.CherryPyWSGIServer( 39 | (HOST, PORT), app, 40 | server_name='www.cherrypy.example') 41 | server.start() 42 | 43 | elif server == 'rocket': 44 | from rocket import Rocket 45 | server = Rocket((HOST, PORT), 'wsgi', {"wsgi_app":app}) 46 | server.start() 47 | 48 | elif server == 'paste': 49 | from paste import httpserver 50 | httpserver.serve(app, host=HOST, port=PORT) 51 | 52 | elif server == 'twisted': 53 | from twisted.web.server import Site 54 | from twisted.web.wsgi import WSGIResource 55 | from twisted.internet import reactor 56 | 57 | resource = WSGIResource(reactor, reactor.getThreadPool(), app) 58 | reactor.listenTCP(PORT,Site(resource)) 59 | reactor.run() 60 | 61 | 62 | else: 63 | raise Exception('wat') 64 | 65 | 66 | -------------------------------------------------------------------------------- /runbench.py: -------------------------------------------------------------------------------- 1 | """ 2 | Benchmark python web servers 3 | 4 | run each server in ./servers and call ab a number of times, writing results to results.txt 5 | """ 6 | 7 | 8 | import sys 9 | import csv 10 | import subprocess 11 | import time 12 | import re 13 | 14 | GETS = 10000 15 | concurrencies = [(4 ** x) for x in (1,2,3,4)] 16 | REPS = [1,2,3] 17 | 18 | is_pypy = hasattr(sys, 'pypy_version_info') 19 | 20 | wsgis = ['tornado', 'rocket', 'cherrypy', 'twisted', 'paste'] 21 | 22 | if not is_pypy: 23 | wsgis.append('gevent') 24 | wsgis.append('eventlet') 25 | 26 | 27 | def servers(): 28 | yield 'cyclone', 'cyclone', subprocess.Popen('python servers/cyc.py'.split()) 29 | yield 'tornado', 'tornado', subprocess.Popen('python servers/torn.py'.split()) 30 | 31 | for app in ['bottle', 'pyramid', 'flask']: 32 | for host in wsgis: 33 | yield app, host, subprocess.Popen(('python runwsgi.py %s %s' % (host, app)).split()) 34 | 35 | 36 | def metrics(result): 37 | mets = {} 38 | 39 | mets['reqs_per_sec'] = float(re.search('Requests per second:\s+(\S+)', result).group(1)) 40 | 41 | reqs = re.search('Total:\s+(\d+)\s+(\d+)\s+(\S+)\s+(\d+)\s+(\d+)', result) 42 | mets['rs.min'] = reqs.group(1) 43 | mets['rs.mean'] = reqs.group(2) 44 | mets['rs.std'] = reqs.group(3) 45 | mets['rs.median'] = reqs.group(4) 46 | mets['rs.max'] = reqs.group(5) 47 | print mets 48 | return mets 49 | 50 | 51 | headers = 'pypy name host conc rep reqs_per_sec rs.min rs.mean rs.std rs.median rs.max'.split() 52 | 53 | out = csv.writer(file('results.txt', 'w'), delimiter='\t') 54 | out.writerow(headers) 55 | 56 | def write_result(setup, result): 57 | out.writerow(setup + [result[x] for x in headers[len(setup):]]) 58 | 59 | for conc in concurrencies: 60 | 61 | for name, host, server in servers(): 62 | time.sleep(2) 63 | print 'testing %(name)s, %(host)s at concurrency %(conc)s' % locals() 64 | try: 65 | for rep in REPS: 66 | command = 'ab -n %(GETS)s -c %(conc)s http://127.0.0.1:8000/' % locals() 67 | ab = subprocess.Popen(command.split(), stdout=subprocess.PIPE) 68 | ab.wait() 69 | result = ab.stdout.read() 70 | if ab.returncode == 0: 71 | write_result([is_pypy, name, host, conc, rep], metrics(result)) 72 | else: 73 | write_result([is_pypy, name, host, conc, rep], dict([(x,'') for x in headers])) 74 | finally: 75 | server.terminate() 76 | server.wait() 77 | time.sleep(3) 78 | 79 | -------------------------------------------------------------------------------- /pypy-results.txt: -------------------------------------------------------------------------------- 1 | pypy name host conc rep reqs_per_sec rs.min rs.mean rs.std rs.median rs.max 2 | True cyclone cyclone 4 1 1326.61 1 3 5.0 2 67 3 | True cyclone cyclone 4 2 2925.29 1 1 1.0 1 37 4 | True cyclone cyclone 4 3 3115.92 1 1 0.7 1 27 5 | True tornado tornado 4 1 2074.51 1 2 3.1 1 56 6 | True tornado tornado 4 2 3360.03 0 1 0.5 1 26 7 | True tornado tornado 4 3 3695.86 1 1 0.3 1 2 8 | True bottle tornado 4 1 2020.55 1 2 3.0 1 41 9 | True bottle tornado 4 2 2946.2 1 1 0.7 1 32 10 | True bottle tornado 4 3 2931.97 1 1 0.3 1 3 11 | True bottle rocket 4 1 1007.77 1 4 4.6 3 65 12 | True bottle rocket 4 2 1842.85 1 2 1.6 2 49 13 | True bottle rocket 4 3 1878.27 1 2 1.1 2 50 14 | True bottle cherrypy 4 1 1195.91 1 3 4.9 2 84 15 | True bottle cherrypy 4 2 2399.39 0 2 1.7 1 70 16 | True bottle cherrypy 4 3 2490.46 1 1 1.6 1 75 17 | True bottle twisted 4 1 552.07 1 7 8.8 4 121 18 | True bottle twisted 4 2 1799.8 1 2 1.5 2 38 19 | True bottle twisted 4 3 1816.04 1 2 1.5 2 44 20 | True bottle paste 4 1 825.42 1 5 5.9 3 68 21 | True bottle paste 4 2 1620.24 1 2 1.5 2 44 22 | True bottle paste 4 3 1612.16 1 2 2.1 2 69 23 | True pyramid tornado 4 1 1968.82 1 2 4.4 1 76 24 | True pyramid tornado 4 2 3946.54 1 1 1.0 1 49 25 | True pyramid tornado 4 3 2858.94 1 1 0.3 1 3 26 | True pyramid rocket 4 1 1011.8 1 4 5.1 2 75 27 | True pyramid rocket 4 2 2104.17 1 2 1.0 2 45 28 | True pyramid rocket 4 3 2075.6 1 2 1.3 2 63 29 | True pyramid cherrypy 4 1 1187.31 1 3 5.1 2 82 30 | True pyramid cherrypy 4 2 2467.52 0 1 1.8 1 90 31 | True pyramid cherrypy 4 3 2477.91 0 1 2.0 1 96 32 | True pyramid twisted 4 1 516.36 1 8 9.3 5 126 33 | True pyramid twisted 4 2 1679.2 1 2 1.6 2 62 34 | True pyramid twisted 4 3 1749.77 1 2 0.9 2 26 35 | True pyramid paste 4 1 782.7 1 5 6.7 3 79 36 | True pyramid paste 4 2 1652.14 1 2 1.8 2 72 37 | True pyramid paste 4 3 1579.61 1 2 2.1 2 91 38 | True flask tornado 4 1 1480.15 1 3 3.9 1 60 39 | True flask tornado 4 2 2371.48 1 2 1.3 1 36 40 | True flask tornado 4 3 2272.57 1 2 1.3 1 28 41 | True flask rocket 4 1 739.52 1 5 6.2 3 80 42 | True flask rocket 4 2 1249.2 1 3 2.2 3 49 43 | True flask rocket 4 3 1218.15 1 3 2.4 3 50 44 | True flask cherrypy 4 1 822.63 1 5 6.3 3 81 45 | True flask cherrypy 4 2 1446.61 1 3 2.7 2 55 46 | True flask cherrypy 4 3 1513.82 1 2 2.8 2 69 47 | True flask twisted 4 1 405.81 1 10 9.8 7 99 48 | True flask twisted 4 2 1182.77 1 3 3.0 3 85 49 | True flask twisted 4 3 1211.95 1 3 2.8 3 60 50 | True flask paste 4 1 631.36 1 6 7.0 4 69 51 | True flask paste 4 2 1032.47 1 4 4.8 3 78 52 | True flask paste 4 3 1057.72 1 4 4.1 3 64 53 | True cyclone cyclone 16 1 1344.31 2 12 14.4 5 128 54 | True cyclone cyclone 16 2 3435.75 2 5 1.8 4 30 55 | True cyclone cyclone 16 3 3127.85 2 5 2.3 5 37 56 | True tornado tornado 16 1 2164.7 3 7 7.4 5 54 57 | True tornado tornado 16 2 4245.74 1 4 1.2 3 21 58 | True tornado tornado 16 3 3282.51 1 5 1.7 5 34 59 | True bottle tornado 16 1 2141.72 2 7 7.6 5 62 60 | True bottle tornado 16 2 3351.4 2 5 1.8 5 36 61 | True bottle tornado 16 3 4099.25 2 4 1.5 3 31 62 | True bottle rocket 16 1 930.11 6 17 11.9 12 79 63 | True bottle rocket 16 2 1712.91 5 9 3.0 9 49 64 | True bottle rocket 16 3 1734.59 4 9 1.9 9 46 65 | True bottle cherrypy 16 1 1148.97 1 13 88.5 4 3244 66 | True bottle cherrypy 16 2 2184.21 1 7 56.1 3 1327 67 | True bottle cherrypy 16 3 2341.69 1 6 71.9 3 3141 68 | True bottle twisted 16 1 616.95 2 26 22.8 16 170 69 | True bottle twisted 16 2 1869.94 2 8 4.5 8 72 70 | True bottle twisted 16 3 1938.03 2 8 3.1 8 45 71 | True bottle paste 16 1 816.07 2 19 99.3 6 3027 72 | True bottle paste 16 2 1462.96 2 10 72.6 5 3011 73 | True bottle paste 16 3 1457.95 2 10 69.3 5 1670 74 | True pyramid tornado 16 1 1860.54 2 8 10.4 5 113 75 | True pyramid tornado 16 2 4064.46 2 4 3.2 3 72 76 | True pyramid tornado 16 3 4217.99 2 4 2.1 3 49 77 | True pyramid rocket 16 1 958.54 6 17 12.5 11 94 78 | True pyramid rocket 16 2 1954.39 5 8 2.4 8 60 79 | True pyramid rocket 16 3 1914.97 4 8 3.2 8 85 80 | True pyramid cherrypy 16 1 1097.21 1 14 95.8 4 3008 81 | True pyramid cherrypy 16 2 2485.76 1 6 58.3 3 3007 82 | True pyramid cherrypy 16 3 2434.37 1 6 52.9 3 1344 83 | True pyramid twisted 16 1 594.82 3 27 24.1 17 184 84 | True pyramid twisted 16 2 1944.93 3 8 3.6 7 69 85 | True pyramid twisted 16 3 1940.21 2 8 3.6 7 68 86 | True pyramid paste 16 1 756.5 2 20 110.0 6 3060 87 | True pyramid paste 16 2 1537.32 2 10 76.9 4 3017 88 | True pyramid paste 16 3 1555.35 2 10 68.4 4 1613 89 | True flask tornado 16 1 1401.25 5 11 10.4 7 107 90 | True flask tornado 16 2 2041.93 1 8 4.9 7 66 91 | True flask tornado 16 3 2236.3 1 7 4.3 6 41 92 | True flask rocket 16 1 727.62 9 22 13.9 15 93 93 | True flask rocket 16 2 1180.76 5 13 4.9 12 71 94 | True flask rocket 16 3 1246.98 5 13 4.5 12 54 95 | True flask cherrypy 16 1 821.24 2 19 118.5 6 3672 96 | True flask cherrypy 16 2 1382.21 2 11 75.5 5 3011 97 | True flask cherrypy 16 3 1398.58 1 11 73.3 4 2053 98 | True flask twisted 16 1 444.81 4 36 24.4 30 185 99 | True flask twisted 16 2 1278.72 3 12 4.7 12 73 100 | True flask twisted 16 3 1273.8 3 12 6.8 12 131 101 | True flask paste 16 1 608.12 2 26 119.0 8 3215 102 | True flask paste 16 2 1043.39 2 15 88.1 6 3020 103 | True flask paste 16 3 1059.7 2 15 97.6 6 3012 104 | True cyclone cyclone 64 1 1473.9 8 43 60.0 21 1147 105 | True cyclone cyclone 64 2 3563.3 6 18 6.8 16 67 106 | True cyclone cyclone 64 3 3717.28 7 17 6.2 16 48 107 | True tornado tornado 64 1 2004.96 12 32 19.9 22 119 108 | True tornado tornado 64 2 4371.41 10 14 4.2 12 38 109 | True tornado tornado 64 3 3646.35 4 17 4.4 19 43 110 | True bottle tornado 64 1 2131.05 7 30 21.5 20 130 111 | True bottle tornado 64 2 3521.32 3 18 4.2 19 44 112 | True bottle tornado 64 3 5171.88 2 12 3.3 12 39 113 | True bottle rocket 64 1 960.94 19 66 38.0 50 184 114 | True bottle rocket 64 2 1769.38 10 36 5.0 35 87 115 | True bottle rocket 64 3 1802.82 11 35 4.7 35 77 116 | True bottle cherrypy 64 1 1145.15 1 50 330.2 4 7623 117 | True bottle cherrypy 64 2 1980.77 1 19 158.7 3 4429 118 | True bottle cherrypy 64 3 601.49 1 20 218.3 3 16596 119 | True bottle twisted 64 1 632.22 10 101 118.5 71 1325 120 | True bottle twisted 64 2 1806.78 11 35 11.6 34 90 121 | True bottle twisted 64 3 1866.79 8 34 30.7 34 1040 122 | True bottle paste 64 1 123 | True bottle paste 64 2 994.15 2 44 367.8 5 8574 124 | True bottle paste 64 3 125 | True pyramid tornado 64 1 2136.0 6 30 24.8 18 135 126 | True pyramid tornado 64 2 3671.66 2 17 4.2 19 43 127 | True pyramid tornado 64 3 3772.98 2 17 5.0 18 54 128 | True pyramid rocket 64 1 964.95 16 66 39.9 42 207 129 | True pyramid rocket 64 2 1886.95 8 34 4.1 33 77 130 | True pyramid rocket 64 3 1851.71 13 34 5.5 34 102 131 | True pyramid cherrypy 64 1 1114.13 2 47 308.9 4 7019 132 | True pyramid cherrypy 64 2 133 | True pyramid cherrypy 64 3 2351.23 1 21 165.7 3 3621 134 | True pyramid twisted 64 1 630.46 13 101 103.0 76 2471 135 | True pyramid twisted 64 2 1848.5 11 34 7.4 34 84 136 | True pyramid twisted 64 3 1914.1 12 33 6.6 33 87 137 | True pyramid paste 64 1 138 | True pyramid paste 64 2 139 | True pyramid paste 64 3 1409.24 1 31 202.2 5 4427 140 | True flask tornado 64 1 1372.09 9 46 30.5 31 202 141 | True flask tornado 64 2 2322.71 6 27 8.3 24 61 142 | True flask tornado 64 3 2293.72 2 28 9.4 24 84 143 | True flask rocket 64 1 738.19 22 86 43.5 64 236 144 | True flask rocket 64 2 1202.13 8 53 9.8 50 130 145 | True flask rocket 64 3 1253.33 8 51 9.3 47 107 146 | True flask cherrypy 64 1 848.13 2 62 300.9 6 7466 147 | True flask cherrypy 64 2 148 | True flask cherrypy 64 3 1422.01 2 33 245.0 4 7013 149 | True flask twisted 64 1 497.01 25 128 105.8 109 1300 150 | True flask twisted 64 2 1294.4 21 49 27.3 47 1054 151 | True flask twisted 64 3 1316.81 12 48 47.2 46 1060 152 | True flask paste 64 1 153 | True flask paste 64 2 154 | True flask paste 64 3 155 | True cyclone cyclone 256 1 1484.32 23 143 333.4 58 4656 156 | True cyclone cyclone 256 2 3354.01 11 61 144.3 38 1278 157 | True cyclone cyclone 256 3 1941.17 29 129 230.0 74 3118 158 | True tornado tornado 256 1 1988.24 24 107 256.9 43 3426 159 | True tornado tornado 256 2 3904.08 14 53 133.4 30 1250 160 | True tornado tornado 256 3 3237.95 22 57 130.2 41 1263 161 | True bottle tornado 256 1 2307.86 15 96 228.9 40 3048 162 | True bottle tornado 256 2 3193.79 26 62 147.0 44 3008 163 | True bottle tornado 256 3 4455.55 21 49 136.0 24 1059 164 | True bottle rocket 256 1 949.62 37 250 514.6 113 8228 165 | True bottle rocket 256 2 1672.98 25 142 310.0 76 4717 166 | True bottle rocket 256 3 1720.49 30 134 284.1 75 4009 167 | True bottle cherrypy 256 1 168 | True bottle cherrypy 256 2 169 | True bottle cherrypy 256 3 170 | True bottle twisted 256 1 618.6 31 402 783.4 172 8066 171 | True bottle twisted 256 2 1643.55 25 132 382.6 60 4552 172 | True bottle twisted 256 3 1669.4 21 143 362.6 60 3350 173 | True bottle paste 256 1 174 | True bottle paste 256 2 175 | True bottle paste 256 3 176 | True pyramid tornado 256 1 1984.37 14 115 290.2 40 3281 177 | True pyramid tornado 256 2 3358.72 9 59 144.9 38 1455 178 | True pyramid tornado 256 3 3667.51 21 58 152.2 37 1251 179 | True pyramid rocket 256 1 978.75 32 241 512.6 107 7611 180 | True pyramid rocket 256 2 1866.72 25 121 266.0 69 4269 181 | True pyramid rocket 256 3 1892.04 28 125 272.4 70 4026 182 | True pyramid cherrypy 256 1 183 | True pyramid cherrypy 256 2 184 | True pyramid cherrypy 256 3 420.53 0 227 1890.3 3 23736 185 | True pyramid twisted 256 1 641.34 34 383 652.0 148 4194 186 | True pyramid twisted 256 2 1779.11 17 119 340.5 54 3742 187 | True pyramid twisted 256 3 1856.41 18 125 322.5 54 3301 188 | True pyramid paste 256 1 189 | True pyramid paste 256 2 190 | True pyramid paste 256 3 1332.33 1 97 414.4 5 7017 191 | True flask tornado 256 1 1515.2 21 155 361.0 68 3475 192 | True flask tornado 256 2 2524.73 13 82 207.4 47 3062 193 | True flask tornado 256 3 2425.97 31 93 225.7 50 3066 194 | True flask rocket 256 1 753.28 38 315 599.1 141 10130 195 | True flask rocket 256 2 1237.35 36 184 356.7 103 7125 196 | True flask rocket 256 3 1217.11 27 192 426.9 105 7785 197 | True flask cherrypy 256 1 804.7 2 179 687.7 6 9625 198 | True flask cherrypy 256 2 199 | True flask cherrypy 256 3 369.48 1 371 2437.5 5 26963 200 | True flask twisted 256 1 519.22 35 479 879.7 210 7911 201 | True flask twisted 256 2 1240.29 20 184 483.9 80 7109 202 | True flask twisted 256 3 1269.22 28 181 598.9 73 7664 203 | True flask paste 256 1 204 | True flask paste 256 2 205 | True flask paste 256 3 206 | -------------------------------------------------------------------------------- /cpy-results.txt: -------------------------------------------------------------------------------- 1 | pypy name host conc rep reqs_per_sec rs.min rs.mean rs.std rs.median rs.max 2 | False cyclone cyclone 4 1 1275.95 2 3 0.4 3 9 3 | False cyclone cyclone 4 2 1359.84 2 3 0.3 3 9 4 | False cyclone cyclone 4 3 1283.37 2 3 0.4 3 9 5 | False tornado tornado 4 1 1165.27 2 3 0.3 3 7 6 | False tornado tornado 4 2 1780.96 1 2 0.5 2 7 7 | False tornado tornado 4 3 1158.15 1 3 0.2 3 7 8 | False bottle tornado 4 1 1236.9 3 3 0.1 3 7 9 | False bottle tornado 4 2 1236.43 1 3 0.2 3 8 10 | False bottle tornado 4 3 1229.26 1 3 0.2 3 8 11 | False bottle rocket 4 1 811.27 2 5 1.1 5 10 12 | False bottle rocket 4 2 828.0 2 5 1.1 5 10 13 | False bottle rocket 4 3 822.95 1 5 1.1 5 11 14 | False bottle cherrypy 4 1 919.71 1 4 1.0 4 9 15 | False bottle cherrypy 4 2 928.41 2 4 1.0 4 8 16 | False bottle cherrypy 4 3 929.21 1 4 1.0 4 8 17 | False bottle twisted 4 1 596.53 3 7 1.0 7 13 18 | False bottle twisted 4 2 602.64 3 6 1.0 6 11 19 | False bottle twisted 4 3 597.13 3 7 1.0 6 12 20 | False bottle paste 4 1 680.03 2 6 1.2 6 12 21 | False bottle paste 4 2 666.87 2 6 1.2 6 11 22 | False bottle paste 4 3 669.24 2 6 1.2 6 13 23 | False bottle gevent 4 1 1740.27 0 2 1.3 2 7 24 | False bottle gevent 4 2 1794.34 0 2 1.2 2 6 25 | False bottle gevent 4 3 1397.55 0 3 1.6 2 7 26 | False bottle eventlet 4 1 1228.56 2 3 0.8 4 6 27 | False bottle eventlet 4 2 1030.33 1 4 0.5 4 5 28 | False bottle eventlet 4 3 1292.59 1 3 0.8 2 4 29 | False pyramid tornado 4 1 2078.69 2 2 0.2 2 10 30 | False pyramid tornado 4 2 2109.41 1 2 0.1 2 3 31 | False pyramid tornado 4 3 2109.24 1 2 0.1 2 4 32 | False pyramid rocket 4 1 862.52 1 4 1.1 4 10 33 | False pyramid rocket 4 2 876.8 2 4 1.1 4 9 34 | False pyramid rocket 4 3 865.28 2 4 1.1 4 10 35 | False pyramid cherrypy 4 1 891.0 2 4 1.0 4 9 36 | False pyramid cherrypy 4 2 894.02 1 4 1.0 4 9 37 | False pyramid cherrypy 4 3 902.42 2 4 1.0 4 10 38 | False pyramid twisted 4 1 593.82 2 7 1.0 7 17 39 | False pyramid twisted 4 2 600.56 4 7 1.0 6 11 40 | False pyramid twisted 4 3 588.29 3 7 1.0 7 12 41 | False pyramid paste 4 1 677.03 2 6 1.2 6 12 42 | False pyramid paste 4 2 677.14 2 6 1.2 6 11 43 | False pyramid paste 4 3 674.23 2 6 1.2 6 11 44 | False pyramid gevent 4 1 1158.02 1 3 1.8 3 8 45 | False pyramid gevent 4 2 1388.7 1 3 1.6 2 6 46 | False pyramid gevent 4 3 1252.52 0 3 1.8 3 7 47 | False pyramid eventlet 4 1 1048.3 2 4 0.8 4 7 48 | False pyramid eventlet 4 2 1057.69 1 4 0.8 4 5 49 | False pyramid eventlet 4 3 1222.03 2 3 0.9 3 5 50 | False flask tornado 4 1 1045.23 2 4 0.9 4 11 51 | False flask tornado 4 2 979.98 1 4 0.7 4 10 52 | False flask tornado 4 3 937.61 2 4 0.6 4 5 53 | False flask rocket 4 1 681.38 2 6 1.5 6 14 54 | False flask rocket 4 2 680.31 2 6 1.5 6 18 55 | False flask rocket 4 3 674.49 2 6 1.5 6 14 56 | False flask cherrypy 4 1 699.85 2 6 1.4 5 17 57 | False flask cherrypy 4 2 682.48 2 6 1.4 6 14 58 | False flask cherrypy 4 3 685.06 2 6 1.4 6 16 59 | False flask twisted 4 1 503.54 3 8 1.2 8 16 60 | False flask twisted 4 2 495.3 4 8 1.1 8 14 61 | False flask twisted 4 3 500.2 3 8 1.1 8 18 62 | False flask paste 4 1 547.24 3 7 1.5 7 17 63 | False flask paste 4 2 549.94 2 7 1.5 7 16 64 | False flask paste 4 3 553.63 2 7 1.5 7 16 65 | False flask gevent 4 1 1076.62 1 4 2.1 3 9 66 | False flask gevent 4 2 985.11 1 4 2.3 3 9 67 | False flask gevent 4 3 907.43 1 4 2.4 4 9 68 | False flask eventlet 4 1 1410.98 2 3 0.2 3 7 69 | False flask eventlet 4 2 1381.58 2 3 0.2 3 6 70 | False flask eventlet 4 3 1411.24 2 3 0.2 3 6 71 | False cyclone cyclone 16 1 1564.29 6 10 1.4 10 18 72 | False cyclone cyclone 16 2 1571.25 5 10 1.4 10 18 73 | False cyclone cyclone 16 3 1566.92 5 10 1.4 10 19 74 | False tornado tornado 16 1 1932.59 4 8 1.8 8 18 75 | False tornado tornado 16 2 2137.76 4 7 0.5 7 12 76 | False tornado tornado 16 3 2127.71 3 7 0.5 7 13 77 | False bottle tornado 16 1 2160.98 6 7 1.3 7 15 78 | False bottle tornado 16 2 1239.18 5 13 0.6 13 16 79 | False bottle tornado 16 3 2108.56 4 7 1.2 7 19 80 | False bottle rocket 16 1 788.82 10 20 2.1 20 30 81 | False bottle rocket 16 2 790.94 7 20 2.2 20 32 82 | False bottle rocket 16 3 793.66 9 20 2.2 20 31 83 | False bottle cherrypy 16 1 891.26 3 18 91.9 9 3013 84 | False bottle cherrypy 16 2 964.63 2 16 97.8 8 3016 85 | False bottle cherrypy 16 3 986.71 2 16 100.4 8 3922 86 | False bottle twisted 16 1 630.42 10 25 2.9 25 43 87 | False bottle twisted 16 2 643.28 9 25 2.9 25 42 88 | False bottle twisted 16 3 654.21 8 24 2.9 24 42 89 | False bottle paste 16 1 631.47 4 25 112.2 12 3018 90 | False bottle paste 16 2 631.78 4 25 109.0 12 3021 91 | False bottle paste 16 3 643.4 4 24 110.1 12 3021 92 | False bottle gevent 16 1 1188.4 1 13 7.3 14 31 93 | False bottle gevent 16 2 1189.18 1 13 7.3 14 30 94 | False bottle gevent 16 3 1196.12 1 13 7.2 13 26 95 | False bottle eventlet 16 1 986.38 4 16 0.5 16 19 96 | False bottle eventlet 16 2 993.77 2 16 0.4 16 19 97 | False bottle eventlet 16 3 992.65 3 16 0.4 16 19 98 | False pyramid tornado 16 1 2149.47 7 7 0.5 7 15 99 | False pyramid tornado 16 2 2043.26 4 8 0.6 8 17 100 | False pyramid tornado 16 3 1413.24 1 11 2.8 13 17 101 | False pyramid rocket 16 1 850.4 10 19 1.7 19 28 102 | False pyramid rocket 16 2 833.7 8 19 1.8 19 31 103 | False pyramid rocket 16 3 835.26 6 19 1.9 19 30 104 | False pyramid cherrypy 16 1 871.62 4 18 110.8 9 3224 105 | False pyramid cherrypy 16 2 864.5 4 18 104.2 9 3284 106 | False pyramid cherrypy 16 3 867.86 3 18 98.1 9 3019 107 | False pyramid twisted 16 1 617.46 8 26 3.2 26 44 108 | False pyramid twisted 16 2 624.02 8 25 2.9 25 45 109 | False pyramid twisted 16 3 637.87 10 25 2.8 25 43 110 | False pyramid paste 16 1 641.07 4 24 123.2 12 3271 111 | False pyramid paste 16 2 646.33 4 24 108.5 12 3018 112 | False pyramid paste 16 3 639.88 5 25 119.6 12 3222 113 | False pyramid gevent 16 1 1185.37 1 13 7.3 13 27 114 | False pyramid gevent 16 2 1551.48 1 10 6.4 9 28 115 | False pyramid gevent 16 3 2040.29 1 8 4.2 8 22 116 | False pyramid eventlet 16 1 1249.16 4 13 3.3 10 18 117 | False pyramid eventlet 16 2 1439.67 2 11 2.0 10 18 118 | False pyramid eventlet 16 3 1548.59 3 10 2.0 10 17 119 | False flask tornado 16 1 1518.63 6 10 1.7 10 20 120 | False flask tornado 16 2 1556.98 3 10 0.5 10 17 121 | False flask tornado 16 3 1547.4 4 10 1.3 10 19 122 | False flask rocket 16 1 657.87 11 24 2.4 24 37 123 | False flask rocket 16 2 664.03 10 24 2.5 24 38 124 | False flask rocket 16 3 662.04 8 24 2.5 24 38 125 | False flask cherrypy 16 1 675.79 4 23 121.2 11 3222 126 | False flask cherrypy 16 2 688.73 4 23 109.3 11 3325 127 | False flask cherrypy 16 3 695.23 4 22 110.8 11 3020 128 | False flask twisted 16 1 525.52 8 30 3.9 30 55 129 | False flask twisted 16 2 520.47 7 31 3.9 31 54 130 | False flask twisted 16 3 517.36 11 31 3.9 31 57 131 | False flask paste 16 1 589.2 3 27 120.0 13 3023 132 | False flask paste 16 2 567.68 3 27 137.0 13 7031 133 | False flask paste 16 3 525.64 5 30 117.7 15 3116 134 | False flask gevent 16 1 1403.11 1 11 6.8 11 34 135 | False flask gevent 16 2 1310.7 1 12 7.6 12 37 136 | False flask gevent 16 3 1412.75 1 11 7.0 11 36 137 | False flask eventlet 16 1 1268.65 4 12 1.6 12 25 138 | False flask eventlet 16 2 1105.0 2 14 4.2 12 24 139 | False flask eventlet 16 3 1451.08 4 11 0.6 11 16 140 | False cyclone cyclone 64 1 1732.15 22 37 4.5 37 58 141 | False cyclone cyclone 64 2 1722.19 19 37 5.5 37 59 142 | False cyclone cyclone 64 3 1747.93 21 36 5.6 36 64 143 | False tornado tornado 64 1 2002.08 11 32 3.3 31 56 144 | False tornado tornado 64 2 1973.6 11 32 3.8 31 58 145 | False tornado tornado 64 3 2005.71 7 32 2.1 31 42 146 | False bottle tornado 64 1 2123.57 4 30 2.3 30 50 147 | False bottle tornado 64 2 2176.98 7 29 1.5 29 38 148 | False bottle tornado 64 3 2157.82 2 29 1.5 29 39 149 | False bottle rocket 64 1 790.19 15 81 4.2 81 94 150 | False bottle rocket 64 2 791.7 11 80 4.5 80 94 151 | False bottle rocket 64 3 790.49 14 81 4.1 80 96 152 | False bottle cherrypy 64 1 885.37 2 67 395.8 9 8581 153 | False bottle cherrypy 64 2 882.07 3 59 330.9 9 7657 154 | False bottle cherrypy 64 3 155 | False bottle twisted 64 1 653.63 30 98 15.3 98 1085 156 | False bottle twisted 64 2 651.52 49 98 6.1 99 129 157 | False bottle twisted 64 3 667.35 38 96 25.4 96 1097 158 | False bottle paste 64 1 612.93 3 77 377.5 13 15654 159 | False bottle paste 64 2 633.26 3 94 402.2 13 7651 160 | False bottle paste 64 3 619.42 4 92 364.1 13 7251 161 | False bottle gevent 64 1 2010.29 2 32 18.0 31 104 162 | False bottle gevent 64 2 1638.54 2 39 23.5 37 104 163 | False bottle gevent 64 3 2077.72 1 31 16.7 31 62 164 | False bottle eventlet 64 1 1723.73 7 37 1.1 37 41 165 | False bottle eventlet 64 2 1578.66 5 40 5.2 37 64 166 | False bottle eventlet 64 3 1734.73 4 37 1.5 37 40 167 | False pyramid tornado 64 1 2150.38 4 30 1.9 29 42 168 | False pyramid tornado 64 2 2007.81 14 32 2.7 31 59 169 | False pyramid tornado 64 3 2037.05 6 31 2.1 31 46 170 | False pyramid rocket 64 1 844.88 13 75 3.7 75 86 171 | False pyramid rocket 64 2 831.41 16 77 4.2 77 89 172 | False pyramid rocket 64 3 842.17 10 76 3.9 76 87 173 | False pyramid cherrypy 64 1 867.01 2 62 304.8 9 7027 174 | False pyramid cherrypy 64 2 175 | False pyramid cherrypy 64 3 884.45 3 63 330.3 9 7635 176 | False pyramid twisted 64 1 656.27 42 97 27.0 99 1068 177 | False pyramid twisted 64 2 666.31 40 96 30.4 99 1082 178 | False pyramid twisted 64 3 655.15 41 97 40.9 99 1113 179 | False pyramid paste 64 1 642.43 4 91 374.0 12 7223 180 | False pyramid paste 64 2 645.66 3 96 365.2 13 7030 181 | False pyramid paste 64 3 641.0 5 87 352.2 13 7036 182 | False pyramid gevent 64 1 1366.93 2 47 28.1 44 107 183 | False pyramid gevent 64 2 1953.43 2 33 17.8 32 66 184 | False pyramid gevent 64 3 1904.99 2 33 18.2 33 68 185 | False pyramid eventlet 64 1 1515.9 8 42 8.3 39 68 186 | False pyramid eventlet 64 2 1577.42 6 40 3.0 39 64 187 | False pyramid eventlet 64 3 1569.58 5 40 5.4 39 69 188 | False flask tornado 64 1 1705.85 5 37 2.3 36 47 189 | False flask tornado 64 2 1556.88 10 41 3.0 40 68 190 | False flask tornado 64 3 1448.5 5 44 5.9 41 81 191 | False flask rocket 64 1 663.64 19 96 4.6 96 113 192 | False flask rocket 64 2 722.18 11 88 12.9 93 113 193 | False flask rocket 64 3 656.6 9 97 5.6 97 114 194 | False flask cherrypy 64 1 680.39 4 89 388.6 12 7841 195 | False flask cherrypy 64 2 688.68 4 87 357.4 12 7029 196 | False flask cherrypy 64 3 686.68 4 83 376.7 12 7641 197 | False flask twisted 64 1 536.15 47 119 40.2 123 1091 198 | False flask twisted 64 2 534.26 39 120 13.7 119 1111 199 | False flask twisted 64 3 538.36 75 119 5.4 119 174 200 | False flask paste 64 1 538.84 6 113 442.1 15 15053 201 | False flask paste 64 2 533.83 3 108 447.7 16 15045 202 | False flask paste 64 3 526.89 4 110 439.5 16 7036 203 | False flask gevent 64 1 1449.63 2 44 25.5 43 142 204 | False flask gevent 64 2 1546.78 2 41 23.0 41 113 205 | False flask gevent 64 3 1630.49 1 39 21.8 39 84 206 | False flask eventlet 64 1 1429.02 8 44 3.3 43 56 207 | False flask eventlet 64 2 1448.88 5 44 2.4 43 52 208 | False flask eventlet 64 3 1451.97 7 44 2.6 43 52 209 | False cyclone cyclone 256 1 1787.08 41 139 265.7 96 3172 210 | False cyclone cyclone 256 2 1746.49 34 138 235.6 105 3130 211 | False cyclone cyclone 256 3 1788.58 38 139 307.9 91 3937 212 | False tornado tornado 256 1 1925.13 7 116 240.1 64 3076 213 | False tornado tornado 256 2 1947.67 24 112 241.3 64 3284 214 | False tornado tornado 256 3 1981.23 26 116 259.4 63 3083 215 | False bottle tornado 256 1 2005.43 24 112 255.7 61 3077 216 | False bottle tornado 256 2 2085.06 25 111 283.4 60 3080 217 | False bottle tornado 256 3 2093.16 24 114 245.6 61 3597 218 | False bottle rocket 256 1 774.77 32 310 539.9 170 8588 219 | False bottle rocket 256 2 776.91 27 313 510.5 170 7870 220 | False bottle rocket 256 3 776.92 27 311 534.8 170 8421 221 | False bottle cherrypy 256 1 648.7 3 178 809.0 9 15227 222 | False bottle cherrypy 256 2 611.0 3 189 979.8 9 16233 223 | False bottle cherrypy 256 3 595.41 2 195 1074.9 9 16596 224 | False bottle twisted 256 1 691.8 48 326 766.6 209 8495 225 | False bottle twisted 256 2 705.48 43 289 511.9 183 7264 226 | False bottle twisted 256 3 715.18 68 334 616.4 208 7480 227 | False bottle paste 256 1 228 | False bottle paste 256 2 229 | False bottle paste 256 3 230 | False bottle gevent 256 1 1947.26 6 105 270.8 65 3129 231 | False bottle gevent 256 2 1948.7 8 112 268.8 67 3287 232 | False bottle gevent 256 3 1996.04 5 110 253.4 66 3307 233 | False bottle eventlet 256 1 1724.77 15 132 271.1 74 3106 234 | False bottle eventlet 256 2 1549.32 27 146 360.9 76 3366 235 | False bottle eventlet 256 3 1647.86 11 134 298.2 76 3304 236 | False pyramid tornado 256 1 1959.59 39 117 254.1 64 3079 237 | False pyramid tornado 256 2 1975.59 26 118 270.5 65 3078 238 | False pyramid tornado 256 3 1948.21 24 113 252.7 64 3417 239 | False pyramid rocket 256 1 832.08 30 278 446.7 159 7177 240 | False pyramid rocket 256 2 866.12 30 277 513.5 152 9029 241 | False pyramid rocket 256 3 832.15 26 294 517.2 159 8847 242 | False pyramid cherrypy 256 1 592.1 2 194 941.4 9 16727 243 | False pyramid cherrypy 256 2 628.8 1 179 785.0 9 15714 244 | False pyramid cherrypy 256 3 572.46 1 225 1299.9 9 17243 245 | False pyramid twisted 256 1 692.28 61 236 343.9 206 4888 246 | False pyramid twisted 256 2 698.26 64 319 672.8 213 8197 247 | False pyramid twisted 256 3 692.46 69 307 673.2 208 8376 248 | False pyramid paste 256 1 249 | False pyramid paste 256 2 250 | False pyramid paste 256 3 251 | False pyramid gevent 256 1 1942.93 3 109 249.0 67 3127 252 | False pyramid gevent 256 2 1929.0 10 107 235.7 66 3121 253 | False pyramid gevent 256 3 1890.81 16 119 252.2 71 3246 254 | False pyramid eventlet 256 1 1582.69 14 139 267.6 80 3472 255 | False pyramid eventlet 256 2 1587.48 15 141 296.5 80 3298 256 | False pyramid eventlet 256 3 1586.1 15 149 330.8 80 3102 257 | False flask tornado 256 1 1703.26 7 138 274.5 74 3282 258 | False flask tornado 256 2 1560.49 24 153 358.9 82 3297 259 | False flask tornado 256 3 1571.13 28 138 281.5 82 3349 260 | False flask rocket 256 1 664.15 30 362 560.8 199 9407 261 | False flask rocket 256 2 667.56 30 354 567.5 198 10363 262 | False flask rocket 256 3 638.71 25 367 614.8 197 10343 263 | False flask cherrypy 256 1 264 | False flask cherrypy 256 2 265 | False flask cherrypy 256 3 266 | False flask twisted 256 1 533.18 85 276 695.3 225 16769 267 | False flask twisted 256 2 268 | False flask twisted 256 3 548.31 18 387 1020.4 208 17041 269 | False flask paste 256 1 526.98 5 395 1456.2 17 17987 270 | False flask paste 256 2 514.09 5 355 956.9 18 16990 271 | False flask paste 256 3 272 | False flask gevent 256 1 1534.39 4 146 316.9 87 3151 273 | False flask gevent 256 2 1548.57 21 152 347.5 86 3299 274 | False flask gevent 256 3 1541.72 13 142 327.4 86 3302 275 | False flask eventlet 256 1 1330.67 14 181 477.8 99 7118 276 | False flask eventlet 256 2 1427.56 16 160 287.5 87 3114 277 | False flask eventlet 256 3 1389.44 13 162 315.9 95 3113 278 | --------------------------------------------------------------------------------