2016-04-06 11 views
0

Mein Programm interagiert mit einer API, führt Berechnungen aus und erstellt ein Gui mit Informationen, von denen einige in lokalen Dateien gespeichert werden (um Informationen zu erhalten zwischen Logins). Wenn cProfile mit meinem Code profilieren, erhalte ich die folgende Ausgabe:Ich denke, mein Programm ist durch Datei-I/O blockiert, und ich brauche eine bessere Lösung

C:\Users\cheek\Documents\Code\LoL-Performance-Tracker>python -m cProfile -s tottime LoL-Performance-Tracker.py 
LoL-Performance-Tracker.py:271: SyntaxWarning: name 'apiKey' is used prior to global declaration 
    global apiKey 
Entered buildMatchHistory 
     262880 function calls (261634 primitive calls) in 11.867 seconds 

    Ordered by: internal time 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     161 8.684 0.054 8.684 0.054 decoder.py:370(raw_decode) 
     1 1.100 1.100 1.100 1.100 {question} 
     1 0.694 0.694 1.794 1.794 {built-in method exec_} 
     1 0.506 0.506 9.848 9.848 LoL-Performance-Tracker.py:88(buildMatchHistory) 
     168 0.361 0.002 0.361 0.002 {method 'read' of 'file' objects} 
     84 0.073 0.001 0.149 0.002 ConfigParser.py:464(_read) 
     1 0.040 0.040 11.867 11.867 LoL-Performance-Tracker.py:7(<module>) 
     80 0.035 0.000 9.323 0.117 MatchHistoryBuilder.py:37(buildMatch) 
     161 0.026 0.000 9.074 0.056 __init__.py:258(load) 
     251 0.025 0.000 0.025 0.000 {open} 
     1 0.023 0.023 0.023 0.023 {built-in method show} 
    23338 0.019 0.000 0.019 0.000 {method 'match' of '_sre.SRE_Pattern' objects} 
    23176 0.017 0.000 0.017 0.000 collections.py:59(__setitem__) 
     2 0.016 0.008 0.016 0.008 {built-in method setWidget} 
     84 0.010 0.000 0.010 0.000 {built-in method setStyleSheet} 
    11844 0.008 0.000 0.008 0.000 {method 'readline' of 'file' objects} 
     1 0.006 0.006 11.704 11.704 LoL-Performance-Tracker.py:326(main) 

... 

Die buildMatchHistory Methode ist das, was ich dachte, das Problem wäre, weil es GUI-Objekte erstellt und im Allgemeinen ziemlich umständlich ist, aber es scheint nicht, sein.

Ich verwende einen Json-Encoder/Decoder, um Datei-I/O mit einer guten Menge an Informationen durchzuführen. Ich würde nicht denken, dass es mehrere Sekunden dauern würde, um diese Operationen auszuführen, aber es sieht so aus. Bin ich in meinem Verständnis dieser Ausgabe richtig? Wenn nicht, wo sollte ich stattdessen suchen?

Wenn ich recht habe, was ist eine bessere Lösung für das Ziehen und Speichern von Informationen zwischen Logins?

+0

Sie interpretieren die Ergebnisse korrekt. Wie viele Dateien speichern Sie?Wenn die Zielinformationen über viele Dateien verteilt sind, kann es zu einer gewissen Geschwindigkeitssteigerung kommen, wenn die Lesevorgänge mit Multiprocessing parallelisiert werden. – skrrgwasme

+0

Die Profiler-Ausgabe wäre zusammen mit dem Code viel hilfreicher. –

+0

Soll ich nur den Code posten oder einen Link zu einem Pastebin hinzufügen oder? –

Antwort

1

Versuchen Sie es mit PerfMon

cProfile sieht wirklich cool aus, aber haben Sie jemals Performance Monitor verwendet? Wenn Sie Windows ausführen, wird es mit einer Anwendung namens "Perfmon" kommen. Wenn Sie diese Anwendung aufrufen, können Sie fast jedes Leistungsproblem durch die Verwendung eines Leistungszählers überwachen (PFs sind nicht wichtig). Dies könnte Ihnen wirklich helfen, Ihren Engpass zu finden. Ich werde Sie durch die Verwendung der Festplatte führen. So funktioniert es ...

Öffnen Sie die Anwendung und klicken Sie mit der linken Maustaste auf "Systemmonitor" unter dem Ordner Überwachungstools. Klicken Sie mit der rechten Maustaste auf das Diagramm und klicken Sie auf "Zähler hinzufügen ...". Ihnen wird ein Fenster angezeigt.

enter image description here

Wenn Sie Physikalischer navigieren nach unten können Sie einen Zähler für Disk Read und Disk Write Prozentsatz hinzufügen. Sobald Sie diese Leistungsindikatoren hinzugefügt haben, können Sie die Auslastung der Festplatte im Diagramm überwachen.

Hinweis: Sie können diese Taktik auf jedes Leistungsproblem anwenden, das Sie haben!

Adressierung Ihres Problem

Wenn Ihre Festplattennutzung niedrig ist, dann I/O ist wahrscheinlich kein Problem.

Ihr cProfil scheint zu denken, dass der "Decoder" viel zu "tottime" beiträgt. Versuchen Sie, Ihren Prozessor zu überprüfen, ob er zu 100% ausgeführt wird. Wenn ja, könnten Sie den Decoder vereinfachen oder diese Berechnungen auf eine GPU übertragen.

Wenn Ihre Festplatte über USB angeschlossen ist, können Sie auch die USB-Leistung überwachen.

Ich sehe "Login" in Ihrem Beitrag. Vielleicht gibt es etwas, das eine Online-Ressource anruft. Versuchen Sie, das Netzwerk zu überwachen.

Vielleicht haben Sie nicht genug RAM, überprüfen Sie es.

Sie können diese Methode verwenden, um mögliche Engpässe einzeln zu beheben, wenn alles andere fehlschlägt. Ich wünsche Ihnen viel Glück bei der Suche nach Ihrem Flaschenhals und freue mich darauf, die Ideen anderer zu sehen.

+0

Danke, das ist hilfreich. Ich habe meine Read/Write% s überprüft, aber beide kommen nicht über 10% und sind meist sehr klein. Ich denke nicht, dass dies ein Aufhängen von Lesen und Schreiben bedeutet. Angesichts dieser Tatsache, was wäre eine bessere Möglichkeit zum Speichern von Informationen, so dass ich dies 161 Mal in meinem Code nicht tun muss? –