Wie misst man Pythons Asyncocode-Leistung?

8

Ich kann nicht normale Werkzeuge und Techniken verwenden, um die Leistung einer Koroutine zu messen, weil die Zeit, die es bei await braucht, nicht in Betracht gezogen werden sollte (oder es sollte nur den Aufwand des Lesens von dem Erwarteten berücksichtigen IO Latenz).

Wie misst man also die Zeit, die eine Coroutine braucht? Wie vergleiche ich 2 Implementierungen und finde die effizienter? Welche Werkzeuge verwende ich?

    
e-satis 16.01.2016, 11:41
quelle

2 Antworten

9

Eine Möglichkeit besteht darin, loop._selector.select zu patchen, um alle IO-Operationen zu speichern und zu speichern. Dies kann mit einem Kontextmanager erfolgen:

%Vor%

Verwenden Sie dann einen anderen Kontextmanager, um den vollständigen Lauf zu synchronisieren, und berechnen Sie den Unterschied zwischen Gesamtzeit und IO-Zeit:

%Vor%

Hier ist ein einfaches Beispiel:

%Vor%

Es druckt den folgenden Bericht:

%Vor%

BEARBEITEN

Ein anderer Ansatz besteht darin, Task abzuleiten und die Methode _step zu überschreiben, um die Ausführung des Schritts zeitlich festzulegen:

%Vor%

Es ist dann möglich, die Unterklasse als Standard-Task-Factory zu registrieren:

%Vor%

Gleiches Beispiel:

%Vor%

Mit der Ausgabe:

%Vor%     
Vincent 16.01.2016, 13:04
quelle
0

Wenn Sie nur die Leistung von "Ihrem" Code messen möchten, könnten Sie den Ansatz ähnlich dem Unit-Test verwenden - nur Monkey-Patch (auch Patch + Mock) die nächste IO-Coroutine mit Future des erwarteten Ergebnisses.

Der Hauptnachteil ist, dass z.B. http-Client ist ziemlich einfach, aber sagen wir momoko (pg client) ... es könnte schwierig sein, ohne seine Interna zu wissen, es wird keinen Bibliotheksaufwand beinhalten.

Die Profis sind wie beim normalen Testen:

  • es ist einfach zu implementieren,
  • es misst etwas;), meist die Implementierung ohne Overhead von Drittanbieter-Bibliotheken,
  • Leistungstests sind isoliert, einfach zu wiederholen,
  • es ist mit vielen Nutzlasten
  • zu laufen
kwarunek 17.01.2016 14:37
quelle