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?
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:
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:
Es ist dann möglich, die Unterklasse als Standard-Task-Factory zu registrieren:
%Vor%Gleiches Beispiel:
%Vor%Mit der Ausgabe:
%Vor%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:
Tags und Links python trace python-asyncio performance-testing