Created
January 5, 2020 20:15
-
-
Save cosarara/4251eea274157f7be4293f3511f12ed0 to your computer and use it in GitHub Desktop.
Benchmark
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import cgi | |
import os | |
import sys | |
from functools import partial | |
from operator import attrgetter | |
from random import randint | |
import json | |
import cherrypy | |
from sqlalchemy.ext.declarative import declarative_base | |
from sqlalchemy import Column | |
from sqlalchemy.types import String, Integer | |
Base = declarative_base() | |
if sys.version_info[0] == 3: | |
xrange = range | |
def getQueryNum(queryString): | |
try: | |
int(queryString) | |
return int(queryString) | |
except ValueError: | |
return 1 | |
class Fortune(Base): | |
__tablename__ = "fortune" | |
id = Column(Integer, primary_key=True) | |
message = Column(String) | |
def serialize(self): | |
return {'id': self.id, 'message': self.message} | |
class World(Base): | |
__tablename__ = "world" | |
id = Column(Integer, primary_key=True) | |
randomNumber = Column(Integer) | |
def serialize(self): | |
return {'id': self.id, 'randomNumber': self.randomNumber} | |
class CherryPyBenchmark(object): | |
@cherrypy.expose | |
@cherrypy.tools.json_out() | |
def json(self): | |
cherrypy.response.headers["Content-Type"] = "application/json" | |
json_message = {"message": "Hello, world!"} | |
return json_message | |
@cherrypy.expose | |
def plaintext(self): | |
cherrypy.response.headers["Content-Type"] = "text/plain" | |
return "Hello, world!" | |
@cherrypy.expose | |
@cherrypy.tools.json_out() | |
def db(self): | |
cherrypy.response.headers["Content-Type"] = "application/json" | |
wid = randint(1, 10000) | |
world = cherrypy.request.db.query(World).get(wid).serialize() | |
return world | |
@cherrypy.expose | |
@cherrypy.tools.json_out() | |
def queries(self, queries=1): | |
num_queries = getQueryNum(queries) | |
if num_queries < 1: | |
num_queries = 1 | |
if num_queries > 500: | |
num_queries = 500 | |
rp = partial(randint, 1, 10000) | |
get = cherrypy.request.db.query(World).get | |
worlds = [get(rp()).serialize() for _ in xrange(num_queries)] | |
return worlds | |
@cherrypy.expose | |
@cherrypy.tools.json_out() | |
def updates(self, queries=1): | |
cherrypy.response.headers["Content-Type"] = "application/json" | |
num_queries = getQueryNum(queries) | |
if num_queries < 1: | |
num_queries = 1 | |
if num_queries > 500: | |
num_queries = 500 | |
worlds = [] | |
rp = partial(randint, 1, 10000) | |
ids = [rp() for _ in xrange(num_queries)] | |
ids.sort() # To avoid deadlock | |
for id in ids: | |
world = cherrypy.request.db.query(World).get(id) | |
world.randomNumber = rp() | |
worlds.append(world.serialize()) | |
cherrypy.request.db.commit() | |
return worlds | |
@cherrypy.expose | |
def fortune(self): | |
fortunes = cherrypy.request.db.query(Fortune).all() | |
fortunes.append( | |
Fortune(id=0, message="Additional fortune added at request time.")) | |
fortunes.sort(key=attrgetter("message")) | |
html = "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>" | |
for f in fortunes: | |
html += "<tr><td>" + str(f.id) + "</td><td>" + cgi.escape( | |
f.message) + "</td></tr>" | |
html += "</table></body></html>" | |
return html | |
if __name__ == "__main__": | |
# Register the SQLAlchemy plugin | |
from saplugin import SAEnginePlugin | |
DBDRIVER = 'mysql' | |
DATABASE_URI = '%s://benchmarkdbuser:benchmarkdbpass@tfb-database:3306/hello_world?charset=utf8' % ( | |
DBDRIVER) | |
SAEnginePlugin(cherrypy.engine, DATABASE_URI).subscribe() | |
# Register the SQLAlchemy tool | |
from satool import SATool | |
cherrypy.tools.db = SATool() | |
cherrypy.server.socket_host = '0.0.0.0' | |
cherrypy.config.update({'environment' : 'production'}) | |
cherrypy.quickstart(CherryPyBenchmark(), '', { | |
'/': { | |
'tools.db.on': True, | |
'log.screen': False, | |
'log.access_file': '' | |
} | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment