[PYTHON] Geschwindigkeitsunterschied zwischen wsgi, Flasche und Flasche

Es ist die Saison von ISUCON. ISUCON verwendet normalerweise das typische Mikroframework in jeder Sprache, aber Python verwendet Flask vorerst.

Flask sieht beim Schreiben einer einfachen Beispiel-App sicherlich wie ein Mikroframework aus. Strukturell gibt es jedoch viele Haken und Signale, und es ist ein schweres Design.

Der kombinierte Kolbenkörper und das Werkzeug haben eine Größe von Zehntausenden von Linien. Selbst eine reine Hello World-App hat Dutzende von Funktionsaufrufen hinter den Kulissen.

Wie Flask ist Bottle ein Framework mit mehreren Threads, einem Kontextstapel, der Thread-Locals verwendet, und Erweiterungen, aber seine Struktur ist viel einfacher als die von Flask. Der Quellcode besteht aus 3000 Zeilen pro Datei, und der Overhead des Frameworks beträgt etwa die Hälfte des Overheads von Flask.

Ich habe eine kleine Messung mit der Hello App gemacht. Vergleichen Sie auf dem MacBook Air 2013 Mid (Core i5 1,3 GHz) eine Single-Thread-Hello-App mit einem Prozess und wrk -t1 -c1. Python ist CPython 3.4.1 und der Webserver ist Meinheld (Github neueste Version).

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

Betrachtet man den Unterschied in der durchschnittlichen Latenz, so sind etwa 100 μs für die Flasche und etwa 350 μs für die Flasche Overheads für Roh-WSGI, was mehr als dem Doppelten der Gesamtleistung entspricht.

Bottle unterstützt auch Jinja-Vorlagen. Selbst wenn Ihre ursprüngliche App Flask war, sollten Sie relativ einfach zu Bottle wechseln können. In Fällen, in denen es viele Pfade gibt, die nur den HTML-Teil zwischenspeichern und die Daten aus Memcached wieder zusammenfügen, sollte die Leistung dieses Basisteils ein nicht zu vernachlässigender Unterschied sein.

Zuletzt werde ich den gemessenen Quellcode einfügen. Versuch es bitte.

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]

#Startmethode
# 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

Geschwindigkeitsunterschied zwischen wsgi, Flasche und Flasche
Unterschied zwischen Prozess und Job
Unterschied zwischen "categoryical_crossentropy" und "sparse_categorical_crossentropy"
Unterschied zwischen np.array und np.arange
Unterschied zwischen MicroPython und CPython
Unterschied zwischen ps a und ps -a
Unterschied zwischen Return und Print-Python
Unterschied zwischen Ruby und Python Split
Unterschied zwischen Java und Python (Memo)
Unterschied zwischen list () und [] in Python
Unterschied zwischen SQLAlchemy filter () und filter_by ()
Unterschied zwischen == und ist in Python
Memorandum (Unterschied zwischen csv.reader und csv.dictreader)
(Hinweis) Unterschied zwischen Gateway und Standard-Gateway
Unterschied zwischen Numpys Randint und Randoms Randint
Unterschied zwischen der Python2-Serie und der Python3-Serie dict.keys ()
Geschwindigkeitsvergleich zwischen CPython und PyPy
[Python] Unterschied zwischen Funktion und Methode
Unterschied zwischen SQLAlchemy flush () und commit ()
Python - Unterschied zwischen exec und eval
[Python] Unterschied zwischen randrange () und randint ()
[Python] Unterschied zwischen sortiert und sortiert (Colaboratory)
Funktion zum Öffnen einer Datei in Python3 (Unterschied zwischen open und codecs.open und Geschwindigkeitsvergleich)
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
[Django ORM] Unterschied zwischen Werten () und nur ()
Unterschiede in der Beziehung zwischen PHP und Python schließlich und beenden
Unterschied zwischen @classmethod und @staticmethod in Python
Unterschied zwischen Anhängen und + = in der Python-Liste
Unterschied zwischen nicht lokal und global in Python
Unterschied zwischen linearer Regression, Ridge-Regression und Lasso-Regression
[Python] Unterschied zwischen Klassenmethode und statischer Methode
Unterschied zwischen Docker-Compose-Datei env_file und .env-Datei
[Python Iroha] Unterschied zwischen Liste und Tupel
[Python] Unterschied zwischen Rand- und Randn-Ausgabe
Unterschied zwischen numpy.ndarray und list (Dimension, Größe)
Unterschied zwischen ls -l und cat Befehl
Differenz- und Kompatibilitätsprüfung zwischen Keras und tf.keras # 1
Was ist der Unterschied zwischen "pip" und "conda"?
Unterschied zwischen Verwendung und Import in der Schildsprache
Unterschied zwischen Variablen und Selbst. Variablen in der [Python] -Klasse
Über den Unterschied zwischen "==" und "is" in Python
Über den Unterschied zwischen PostgreSQL su und sudo
Geschwindigkeitsvergleich zwischen inkrementierender Zählvariable und Aufzählung
Was ist der Unterschied zwischen Unix und Linux?
Berücksichtigung des Unterschieds zwischen ROC-Kurve und PR-Kurve
Grober Unterschied zwischen Unicode und UTF-8 (und seinen Begleitern)
Kann BERT den Unterschied zwischen "Ame (Süßigkeiten)" und "Ame (Regen)" verstehen?
Unterschied zwischen Ruby und Python in Bezug auf Variablen
Was ist der Unterschied zwischen usleep, nanosleep und clock_nanosleep?
Unterschied zwischen Numpy (n,) und (n, 1) Notation [Unterschied zwischen horizontalem Vektor und vertikalem Vektor]
Flask wechselt automatisch zwischen Vorlagenverzeichnissen zwischen PC und Handy
Unterschied zwischen return, return None und no return description in Python
Wie man Argparse benutzt und den Unterschied zwischen Optparse
Mittendifferenz und Vorwärtsdifferenz
Zwischen parametrisch und nicht parametrisch
Mit und ohne WSGI
Führen Sie Apache2 + WSGI + Flask aus
Was ist der Unterschied zwischen symbolischen und harten Links?
Python-Modul num2words Verhaltensunterschied zwischen Englisch und Russisch
Python> Unterschied zwischen Inpbt- und Print-Ausgabe (Inpbt)> [1. 2. 3.] / Array ([1., 2., 3.], dtype = float32)