[GO] [Ruby vs Python] Benchmark-Vergleich zwischen Rails und Flask

Bei der Einführung von Flask, einem kompakten Webframework für Python, haben wir es mit Rails mit DB-Zugriff und Vorlagenvererbung verglichen. Das Ergebnis ist, dass ** Rails schneller ist **, was sich von den externen Web Framework-Benchmarks unterscheidet. In diesem Artikel wird die Ursache identifiziert und behoben.

Benchmark-Ergebnisse

Da es von einzelnen PJs verwendet werden soll, habe ich einen anwendungsspezifischen Benchmark geschrieben und verglichen. Ergebnisse ** Rails ** waren ** 1,493-mal schneller als ** Flask ** **. Rails ist sehr schnell.

スクリーンショット 2015-12-14 18.44.24.png

Ergebnisse unterscheiden sich von Web Framework-Benchmarks

Das Ergebnis unterscheidet sich von Web Framework Benchmarks. Der Kolben ist langsam, da es auf der Codeseite ein Problem zu geben scheint, daher werde ich es überprüfen.

スクリーンショット 2015-12-15 8.10.35.png

Bankbedingungen

Es ist ein auf Anwendungen spezialisierter Benchmark-Test.

Serverstartbefehl


#In beiden Fällen wurde nur ein Thread vom Befehl debug gestartet.

# Rails
rails server

# Flask
python manage.py runserver

Version für jedes Programm

Einstufung Sprache ver Web Framework ver
Flask Python 3.5.0 0.10.1
Rails ruby 2.0.0p451 Rails 4.2.5

Lassen Sie sich mit Apache Bench vergleichen

Es ist ein Befehl zum Messen der Leistung des WEB-Servers, der standardmäßig in Apache enthalten ist und mit dem Befehl ** ab ** (Abkürzung für Apache Bench) ausgeführt werden kann. ab.exe -n <Gesamtzahl der Ausstellungsanforderungen> -c <Anzahl gleichzeitiger Verbindungen> <URL>

ab Befehl


#1000-maliger Zugriff mit einem Parallelitätsgrad von 10
ab -n 1000 -c 10 http://127.0.0.1:3000/

Meine Flasche kann nicht so langsam sein

Letzter Flask-Artikel antwortete mit ** durchschnittlich 2 ms ** ohne DB-Zugriff und Vorlagenvererbung. Die Vorlagenvererbung sollte auf Null Kosten zwischengespeichert werden, und der DB-Zugriff erfordert nicht länger als 7 ms. Sollte es nicht 1-2 ms für den DB-Zugriff sein, selbst wenn Sie viel schätzen? Es muss einen Grund geben.

Danach stellte ich als Ergebnis des Druckdebuggens und der Untersuchung fest, dass das DB-Verbindungspooling in der SQL-Alchemie (O / R Mapper) deaktiviert war, und korrigierte es.

db.py


#Vor der Korrektur
engine = create_engine(db_path, encoding='utf-8')
#Überarbeitet
engine = create_engine(db_path, encoding='utf-8', pool_size=5)

#* Auf der Bank habe ich den Code geschrieben, um die Verbindung wiederzuverwenden, indem ich mich in ThreadLocalStorage eingegraben habe.

Ergebnis der Benchmark-Wiedererfassung

Nach dem erneuten Erwerb des Benchmarks mit aktiviertem DB-Verbindungspooling von Flask war Flask im Durchschnitt die schnellste Anforderungsgeschwindigkeit. Bei der Überprüfung eines unbekannten Webframeworks ist es sinnvoll, die Ergebnisse eines externen Benchmarks gegen die vorliegenden Ergebnisse abzuwägen.

スクリーンショット 2015-12-14 17.10.02.png

スクリーンショット 2015-12-14 17.25.19.png

Einstufung Sprache ver Web Framework ver O/R Mapper
Django Python 2.7.5 Django==1.6.4 Django ursprüngliche Implementierung
Flask Python 3.5.0 0.10.1 SQL Alchemy
Rails ruby 2.0.0p451 Rails 4.2.5 Active Record

Was ich von Flask als Gehaltsingenieur halte

Für mich, der Python bei der Arbeit schreibt, bin ich nicht sehr von Flask angezogen, das in Bezug auf die Ausführungsgeschwindigkeit nur doppelt so schnell ist wie Django. Je mehr Personen in einem Team arbeiten, desto unwahrscheinlicher ist es, dass sie die Vorteile spüren, vorhandene getestete Assets wegzuwerfen und die Lernkosten gemeinsam zu bezahlen. Bei persönlichem PJ möchte ich jedoch die Serverkosten um nur 1 Yen senken und die Nägel anzünden, damit ich sie aktiv nutzen kann. Geld ist wichtig.

Zusammenfassung

--TechEmpower's Web Framework Benchmarks Kompetent

Vergleich von mir me Bench und Web Framework Benchmarks

Ich habe versucht, ein Vergleichsdiagramm zu erstellen. Ich werde die Tatsache untersuchen, dass Django nicht so schnell sein kann, wenn ich Lust dazu habe.

スクリーンショット 2015-12-14 16.26.29.png

Die Welt der Web-Frameworks an der Spitze

** schwelgen ** in go Sprache ist ** 2,41 ** mal schneller als ** Flask **

スクリーンショット 2015-12-14 15.33.41.png

Bankcode

Es macht ziemlich viel Spaß, jedes Tutorial zu machen. Es war schwer zu verstehen, etwas mit dem Befehl "Rails generieren" von Rails zu generieren, da es versteckte, was im Inneren vor sich ging.

Rails

book_controller.rb


class BookController < ApplicationController
  def index
    @msg = 'Test Nachricht';
    # select
    book = Book.where("id = 1").all
    @book = book[0];
  end
end

rb:index.html.erb


<p>
    <%= @msg %><br/>
    <%= @book.id %><br />
    <%= @book.name %><br />
    <%= @book.description %><br />
</p>

Flask

index.html


{% extends "master.html" %}

{% block title %}index{% endblock %}

{% block body %}
<h1>this is index page</h1><br />
{{ book.id }}
{{ book.title }}
{{ book.publish }}
{% endblock %}

root.py


# -*- coding: utf-8 -*-
from flask import render_template, Blueprint

#Der Name des ersten Arguments ist die Vorlagen-URL_Mit dem Namen verknüpft, wenn Sie anrufen
from utils.db import get_db_session
from module.book import Book

app = Blueprint("index",
                __name__,
                url_prefix='/<user_url_slug>')


#URL beim Aufrufen einer Vorlage_for('index.index')
@app.route("/")
def index():
    book = get_db_session().query(Book).filter(Book.id=1).all()
    return render_template('root/index.html', book=book[0])

django

index.html


{% extends "master.html" %}

{% block content %}
{{ book.id }}
{{ book.name }}
{{ book.description }}
{% endblock %}

views.py


class TestView(TemplateView):
    """
    test
    """
    template_name = 'index.html'
    def get(self, request, *args, **kwargs):
        book = Book.objects.filter(id=1).get()
        response = self.render_to_response({
            'book': book,
        })
        return response

Erste Schienen

Ich habe Rails zum ersten Mal benutzt und das Gefühl, völlig erschöpft zu sein, war wunderbar. Ich fand das Rails-Ökosystem nicht so gemütlich. Insbesondere war ich erleichtert, dass die Einstellungen, die von den beiden Systemen für Produktion und Entwicklung ausgegeben wurden, gut durchdacht waren und ein totes Design hatten.

Rails DB-Verbindungspooling-Situation

Es scheint, dass Sie den Poolwert in config / database.yml festlegen können. Wenn es jedoch auf 0 gesetzt ist, tritt ein Fehler auf und es funktioniert nicht. Es scheint, dass das DB-Verbindungspooling in Rails aktiviert sein muss.

Es besteht das Problem, dass das Verbindungspooling in Rails nicht deaktiviert werden kann

Das Aktivieren des DB-Verbindungspoolings wird die Dinge definitiv beschleunigen, hat aber den Nebeneffekt. DB-Serverlast. Selbst wenn Sie die höchste DB-Instanz in AWS mieten und 50.000 Verbindungen herstellen, bleibt die CPU bei 100% und fliegt mit der Last. Für jeden Thread des Servers wird eine DB-Verbindung erstellt. Unter der Annahme von 8 CPUs pro Server ist es üblich, untergeordnete HTTP-Prozesse mit 8-48 Threads zu starten. Selbst wenn pool = 1 festgelegt ist, gibt es 1000 Server einschließlich Timeout. Und DB wird mit Last fliegen.

Die Person in der Beispielfirma hat es gelöst

Die Person auf der Beispielrezeptseite hat das Problem gelöst. Ich denke, dass das Lösen der meisten Probleme nach einer Weile einer der großen Vorteile eines Webframeworks mit vielen Benutzern und einer starken Community ist.

Ihre nächste Zeile ist "Sinatra" ... (・ ㅂ ・) و

Recommended Posts

[Ruby vs Python] Benchmark-Vergleich zwischen Rails und Flask
Unterschied zwischen Ruby und Python Split
Unterschiede zwischen Ruby und Python im Umfang
Mit Ruby (Rails) verschlüsseln und mit Python entschlüsseln
Unterschied zwischen Ruby und Python (grundlegende Syntax)
Vergleich von Python und Ruby (Environment / Grammar / Literal Edition)
Ruby, Python und Map
Python und Ruby teilen sich
Unterschied zwischen Ruby und Python in Bezug auf Variablen
[Ubuntu] [Python] Vergleich der Gesichtserkennung zwischen dlib und OpenCV
Prozessübergreifende Kommunikation zwischen Ruby und Python (POSIX-Nachrichtenwarteschlange)
Vergleich von CoffeeScript mit JavaScript-, Python- und Ruby-Grammatik
Python auf Ruby und wütend Ruby auf Python
Installieren Sie Python und Flask (Windows 10)
Java VS PHP VS Python VS Ruby
Python und Ruby Slice Memo
Ruby- und Python-Syntax ~ branch ~
Python 3 Sortier- und Vergleichsfunktionen
Mandelbrot-Benchmark (C, PHP, HHVM, Ruby, Python, PyPy und Kinx)
Zusammenfassung der Unterschiede zwischen Ruby on Rails und Django ~ Basics ~
Unterschied zwischen Java und Python (Memo)
Unterschied zwischen list () und [] in Python
Unterschied zwischen == und ist in Python
Scraping mit Node, Ruby und Python
Zusammenarbeit zwischen Python-Modul und API
Unterschied zwischen Python, Stftime und Strptime
Unterschied zwischen der Python2-Serie und der Python3-Serie dict.keys ()
Geschwindigkeitsvergleich zwischen CPython und PyPy
[Python] Unterschied zwischen Funktion und Methode
Zusammenfassung der Unterschiede zwischen Python und PHP (Vergleichstabelle der Hauptelemente)
Funktion zum Öffnen einer Datei in Python3 (Unterschied zwischen open und codecs.open und Geschwindigkeitsvergleich)
Python - Unterschied zwischen exec und eval
[Python] Unterschied zwischen randrange () und randint ()
[Python] Unterschied zwischen sortiert und sortiert (Colaboratory)
Vergleich der Deserialisierungsleistung von msgpack (C ++ / Python / Ruby)
Kommunizieren Sie mit gRPC zwischen Elixir und Python
Unterschied in der Authentizität zwischen Python und JavaScript
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
Unterschiede zwischen Python- und Java-Syntax
Unterschiede in der Beziehung zwischen PHP und Python schließlich und beenden
POST verschieden mit Python und empfange mit Flask
Unterschied zwischen @classmethod und @staticmethod in Python
Unterschied zwischen Anhängen und + = in der Python-Liste
Unterschied zwischen nicht lokal und global in Python
[Grundlegende Grammatik] Unterschiede zwischen Ruby / Python / PHP
[Python] Unterschied zwischen Klassenmethode und statischer Methode
[Python3] Wechseln Sie zwischen Shift_JIS, UTF-8 und ASCII
[Python Iroha] Unterschied zwischen Liste und Tupel
[Python] Unterschied zwischen Rand- und Randn-Ausgabe
Geschwindigkeitsunterschied zwischen wsgi, Flasche und Flasche
Vergleich von Python Serverless Frameworks-Zappa mit Chalice
Unterschiede in der Multithread-Verarbeitung zwischen Python und Jython
Einfaches Web-Scraping mit Python und Ruby
Korrespondenz zwischen den in Python integrierten Funktionen und Rust
Kommunikation verschlüsselter Daten zwischen Python und C #
Unterschiede in der Zeichenfolgenverarbeitung zwischen Python, Ruby, JS und PHP (Kombination und Variablenerweiterung)
Unterschiede beim Schreiben von externem Quellcode zwischen Ruby und Python