[PYTHON] Différence de vitesse entre wsgi, bouteille et flacon

C'est la saison d'ISUCON. ISUCON utilise habituellement le microframework typique dans chaque langage, mais Python utilise Flask pour l'instant.

Flask ressemble certainement à un microframework lors de l'écriture d'un exemple d'application simple. Cependant, structurellement, il existe de nombreux crochets et signaux, et c'est une conception lourde.

Le corps Flask combiné et Werkzeug ont une taille de dizaines de milliers de lignes. Même une simple application Hello World a des dizaines d'appels de fonction dans les coulisses.

Comme Flask, Bottle est un framework qui est multi-thread, a une pile de contexte qui utilise des threads locaux et a des extensions, mais sa structure est beaucoup plus simple que Flask. Le code source est de 3000 lignes par fichier et la surcharge du framework est environ la moitié de celle de Flask.

J'ai fait une petite mesure avec l'application Hello. Sur MacBook Air 2013 Mid (Core i5 1,3 GHz), comparez une application Hello à un seul thread et un seul processus avec wrk -t1 -c1. Python est CPython 3.4.1 et le serveur Web est Meinheld (dernière version de Github).

wsgi:

$ wrk -t1 -c1 http://localhost:6000/
Running 10s test @ http://localhost:6000/
  1 threads and 1 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   118.89us   46.59us   0.99ms   91.40%
    Req/Sec     7.57k   622.67     9.90k    67.44%
  71708 requests in 10.00s, 11.08MB read
Requests/sec:   7170.95
Transfer/sec:      1.11MB

Bottle:

$ wrk -t1 -c1 http://localhost:6000/
Running 10s test @ http://localhost:6000/
  1 threads and 1 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   221.92us  678.78us  18.72ms   99.81%
    Req/Sec     4.86k   418.08     6.44k    78.08%
  46110 requests in 10.00s, 7.74MB read
Requests/sec:   4611.09
Transfer/sec:    792.53KB

Flask:

$ wrk -t1 -c1 http://localhost:6000/
Running 10s test @ http://localhost:6000/
  1 threads and 1 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   476.59us  134.74us   1.71ms   79.35%
    Req/Sec     2.11k   194.96     3.10k    65.86%
  19967 requests in 10.00s, 3.35MB read
Requests/sec:   1996.71
Transfer/sec:    343.18KB

En regardant la différence de latence moyenne, environ 100 μs pour Bottle et environ 350 μs pour Flask sont des frais généraux pour le wsgi brut, ce qui représente plus du double de la performance totale.

Bottle prend également en charge les modèles Jinja, donc même si votre application initiale était Flask, vous devriez être raisonnablement facile de passer à Bottle. Dans les cas où il y a beaucoup de chemins qui ne font que mettre en cache la partie HTML et recoller les données de Memcached, les performances de cette partie de base devraient être une différence non négligeable.

Enfin, je mettrai le code source mesuré. Essayez-le.

import flask
import bottle

app = flask.Flask(__name__)
bottle_app = bottle.app()

@bottle_app.route('/')
@app.route('/')
def index():
    return b"Hello, World"

def wsgi(env, start):
    c = b"Hello, World"
    start("200 OK", [('Content-Type', 'text/plain'), ('Content-Length', str(len(c)))])
    return [c]

#méthode de départ
# Flask:  gunicorn -k meinheld.gmeinheld.MeinheldWorker -b :6000 app:app
# Bottle: gunicorn -k meinheld.gmeinheld.MeinheldWorker -b :6000 app:bottle_app
# wsgi:   gunicorn -k meinheld.gmeinheld.MeinheldWorker -b :6000 app:wsgi

Recommended Posts

Différence de vitesse entre wsgi, bouteille et flacon
Différence entre processus et travail
Différence entre "categorical_crossentropy" et "sparse_categorical_crossentropy"
Différence entre np.array et np.arange
Différence entre MicroPython et CPython
Différence entre ps a et ps -a
Différence entre return et print-Python
Différence entre Ruby et Python Split
Différence entre java et python (mémo)
Différence entre list () et [] en Python
Différence entre SQLAlchemy filter () et filter_by ()
Différence entre == et est en python
Mémorandum (différence entre csv.reader et csv.dictreader)
(Remarque) Différence entre la passerelle et la passerelle par défaut
Différence entre le randint de Numpy et le randint de Random
Différence entre la série python2 et la série python3 dict.keys ()
Comparaison de vitesse entre CPython et PyPy
[Python] Différence entre fonction et méthode
Différence entre SQLAlchemy flush () et commit ()
Python - Différence entre exec et eval
[Python] Différence entre randrange () et randint ()
[Python] Différence entre trié et trié (Colaboratoire)
Fonction pour ouvrir un fichier en Python3 (différence entre open et codecs.open et comparaison de vitesse)
différence entre les instructions (instructions) et les expressions (expressions) en Python
[Django ORM] Différence entre values () et only ()
Différences dans la relation entre PHP et Python enfin et quitter
Différence entre @classmethod et @staticmethod en Python
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
Différence entre la régression linéaire, la régression Ridge et la régression Lasso
[Python] Différence entre la méthode de classe et la méthode statique
Différence entre le fichier env_file docker-compose et le fichier .env
[Python Iroha] Différence entre List et Tuple
[python] Différence entre la sortie rand et randn
Différence entre numpy.ndarray et list (dimension, taille)
Différence entre ls -l et la commande cat
Vérification de la différence et de la compatibilité entre keras et tf.keras # 1
Quelle est la différence entre «pip» et «conda»?
Différence entre l'utilisation et l'importation sur le langage de bouclier
[python] Différence entre variable et self. Variable dans la classe
À propos de la différence entre "==" et "is" en python
À propos de la différence entre PostgreSQL su et sudo
Comparaison de vitesse entre la variable de comptage incrémentielle et l'énumération
Quelle est la différence entre Unix et Linux?
Prise en compte de la différence entre la courbe ROC et la courbe PR
Différence approximative entre Unicode et UTF-8 (et ses compagnons)
BERT peut-il comprendre la différence entre «Ame (bonbons)» et «Ame (pluie)»?
Différence entre Ruby et Python en termes de variables
Quelle est la différence entre usleep, nanosleep et clock_nanosleep?
Différence entre la notation Numpy (n,) et (n, 1) [Différence entre le vecteur horizontal et le vecteur vertical]
Flask bascule automatiquement les répertoires de modèles entre le PC et le mobile
Différence entre return, return None et no return description en Python
Comment utiliser argparse et la différence entre optparse
Différence centrale et différence avant
Entre paramétrique et non paramétrique
Avec et sans WSGI
Exécutez Apache2 + WSGI + Flask
Quelle est la différence entre les liens symboliques et les liens durs?
Module Python num2words Différence de comportement entre l'anglais et le russe
Python> Différence entre la sortie inpbt et print (inpbt)> [1. 2. 3.] / array ([1., 2., 3.], dtype = float32)