Heim  >  Artikel  >  Backend-Entwicklung  >  Verwenden von Python zur Implementierung leistungsstarker Testtools (2)

Verwenden von Python zur Implementierung leistungsstarker Testtools (2)

little bottle
little bottlenach vorne
2019-04-10 11:29:014267Durchsuche

Im vorherigen Artikel „Verwenden von Python zur Implementierung von Hochleistungstesttools (1) “ haben wir die Leistung durch Ändern des Python-Parsers optimiert, aber sie ist immer noch weit von den tatsächlichen Anforderungen entfernt. In diesem Artikel wird optimierter Code für automatisierte Tests vorgestellt.

Schema 2: Optimieren Sie den Code

Arbeiter wollen gute Dinge, sie müssen zuerst ihre Instrumente nutzen. Um den Code zu optimieren, müssen Sie zunächst den Engpass des Codes finden. Der einfachste Weg besteht darin, ihn nach Abschluss des Debuggens zu löschen. Python bietet auch viele Profiltools: Profile, CProfile, Hotshot, Pystats, aber die von diesen Tools bereitgestellten Ergebnisse sind nicht gut lesbar. Es ist nicht intuitiv genug, auf einen Blick zu erkennen, welche Funktion oder Zeile die meiste Zeit in Anspruch nimmt. Python line_profiler bietet eine solche Funktion. Sie können intuitiv erkennen, welche Zeile die meiste Zeit in Anspruch nimmt. Sie kann als „schnell, genau und rücksichtslos“ bezeichnet werden 🎜> Nach der Installation von line_profiler befindet sich schließlich eine kernprof.py im Verzeichnis C:Python27Libsite-packages. Fügen Sie @profile zu den Funktionen hinzu, die möglicherweise Engpässe aufweisen, wie zum Beispiel das folgende Beispiel:

    @profile
    def create_msg2(self,H,msg):
        li = msg.keys()
        msg_type=li[0]
        ULR_avps=[]
        ULR=HDRItem()
        ULR.cmd=self.dia.dictCOMMANDname2code(self.dia.MSG_TERM[msg_type])

        if msg_type[-1]=='A':
            msg=msg[msg_type]
            self.dia.setAVPs_by_dic(msg_type,msg,ULR_avps)
            ULR.appId=H.appId
            ULR.EndToEnd=H.EndToEnd
            ULR.HopByHop=H.HopByHop
            msg=self.dia.createRes(ULR,ULR_avps)

        else:
            self.dia.setAVPs(msg_type,msg,ULR_avps)
            ULR.appId=self.dia.APPID
            self.dia.initializeHops(ULR)
            msg=self.dia.createReq(ULR,ULR_avps)

        return msg
Führen Sie diese Datei aus : kernprof.py -l -v D:projectmpsrcprotocolslibdiametermt.py, erhalten Sie die folgenden Ergebnisse. Auf diesem Bild können Sie intuitiv erkennen, dass die setAVPS-Methode 96,6 % der Zeit in Anspruch nimmt. Suchen Sie dann diese Funktion und fügen Sie den @proflie-Modifikator erneut hinzu (Sie können außerdem das Verhältnis von setAVPS sehen). Zeit, die jede Codezeile in der Funktion benötigt.

Durch eine schrittweise Analyse können wir erkennen, dass in der Open-Source-Protokollbibliothek in der setAVPS-Methode nach dem Attribut „AVP finden“ gesucht wird Bei einer 3000er-Schleife muss jeder AVP 3000 Mal durchlaufen werden, es gibt mindestens 10 AvPs in einer Durchmessernachricht und bei jeder Codierung muss ein AVP 30.000 Mal durchlaufen werden. Unsere ursprüngliche Lösung bestand darin, viele AVPS zu löschen, die in unseren Leistungstests nicht verwendet wurden (es gibt keine Möglichkeit, die Testentwicklungsressourcen sind begrenzt und oft gibt es kein gutes Design. Erstellen Sie zunächst etwas, das den Anforderungen entspricht.), aber nur verbessert Mit etwa 150 ist es noch weit von der Nachfrage entfernt. Deshalb haben wir AVP in den Wörterbuchmodus geändert, damit wir die Attribute von AVP anhand des Namens schnell finden können.

Zusätzlich zur Codeoptimierung wurde auch die Anzahl der Codierungs-AVP-Threads erhöht. In den folgenden Kapiteln wird auf die Auswirkungen von Multithreading und Multiprozessen eingegangen. fortgesetzt werden. . . .

[Empfohlener Kurs:

Python-Videokurs

]

Das obige ist der detaillierte Inhalt vonVerwenden von Python zur Implementierung leistungsstarker Testtools (2). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen