Oh Mann, wo soll ich anfangen?
Zuerst bin ich erstaunt, dass dies Nachrichten sind. Zweitens ist das Problem nicht, dass Profiler schlecht sind, ist es einige Profiler sind schlecht. Die Autoren bauten eine, die ihrer Meinung nach gut ist, indem sie nur einige der Fehler vermeiden, die sie in den von ihnen bewerteten gefunden haben. Fehler sind häufig wegen einiger hartnäckiger myths about performance profiling.
Aber lassen Sie uns positiv sein. Will man Möglichkeiten für Speedup finden, es ist wirklich sehr einfach:
Sampling unkorreliert mit dem Zustand des Programms sein sollte.
Das geschieht zu einer wirklich zufälligen Zeit, unabhängig davon, ob das Programm in I/O (außer Benutzereingabe) oder in GC oder in einer engen CPU-Schleife oder was auch immer ist.
Probenahme soll liest den Funktionsaufruf Stapel,
, um zu bestimmen, welche Anweisungen zum Zeitpunkt der Probe „aktiv“ waren. Der Grund ist, dass jede Aufrufstelle (Punkt, an dem eine Funktion aufgerufen wird) einen Prozentsatz hat, der dem Bruchteil der Zeit entspricht, die sie auf dem Stapel ist. (Anmerkung:.. Das Papier betrifft ganz selbst Zeit, die massiven Auswirkungen vermeidbar Funktion ignoriert in großer Software rufen in der Tat der Grund hinter den ursprünglichen gprof
diese Anrufe zu helfen, war zu finden)
Berichterstattung soll zeigen Prozent nach Zeile (nicht nach Funktion).
Wenn eine "hot" -Funktion identifiziert wird, muss man immer noch darin nach den "heißen" Codezeilen suchen, die für die Zeit verantwortlich sind. Diese Information ist in den Beispielen! Warum verstecken Sie es? mit einer Genauigkeit von Messung, und nicht genug mit einer Genauigkeit von Lage
Eine fast universelle Fehler (, dass die Papieranteile) ist zu viel Beunruhigung. Hier ist zum Beispiel ein example of performance tuning , in dem eine Reihe von Leistungsproblemen identifiziert und behoben wurden, was eine kumulierte Beschleunigung von 43 Mal ergab. Es war nicht wichtig, die Größe jedes Problems genau zu kennen, bevor es repariert wurde, sondern seinen Standort zu kennen. Ein Phänomen der Leistungsoptimierung besteht darin, dass die Behebung eines Problems durch die Reduzierung der Zeit die Prozentsätze der verbleibenden Probleme vergrößert, sodass sie leichter zu finden sind. Solange irgendein Problem gefunden und behoben wird, wird Fortschritt in Richtung auf das Ziel gemacht, alle Probleme zu finden und zu beheben. Es ist nicht notwendig, sie in abnehmender Reihenfolge zu korrigieren, aber es ist wichtig, sie genau zu bestimmen.
Zum Thema statistische Genauigkeit der Messung, wenn ein Aufruf Punkt auf dem Stapel ist einige Prozent der Zeit F (wie 20%) und N (wie 100) zufällige Zeit Proben genommen werden, dann die Anzahl der Proben Das zeigt, dass der Aufrufpunkt eine Binomialverteilung ist, mit Mittelwert = NF = 20, Standardabweichung = sqrt (NF (1-F)) = sqrt (16) = 4. Der Prozentsatz der Proben, die ihn anzeigen, beträgt also 20%/- 4%. Also ist das genau? Nicht wirklich, aber ist das Problem gefunden worden? Genau.
In der Tat, je größer ein Problem ist, in Bezug auf Prozent, desto weniger Proben werden benötigt, um es zu lokalisieren. Wenn zum Beispiel 3 Proben genommen werden und ein Anrufpunkt auf 2 von ihnen erscheint, ist es sehr wahrscheinlich sehr teuer. (Konkret, es folgt eine Beta-Verteilung. Wenn Sie 4 einheitliche 0,1 Zufallszahlen generieren und sortieren, ist die Verteilung des dritten die Verteilung der Kosten für diesen Aufrufpunkt. Es ist meine ist (2 + 1)/(3 + 2) = 0.6, das sind also die erwarteten Einsparungen, wenn man diese Beispiele anführt.) INSERTED: Und der Beschleunigungsfaktor, den Sie erhalten, wird durch eine andere Verteilung, BetaPrime, und Durchschnitt ist 4. Also, wenn Sie nehmen 3 Proben, sehen ein Problem auf 2 von ihnen, und beseitigen Sie dieses Problem, im Durchschnitt werden Sie das Programm viermal schneller machen.
Es ist höchste Zeit, dass wir Programmierer beim Thema Profiling die Spinnweben aus dem Kopf rissen.
Disclaimer - die Zeitung konnte meinen Artikel nicht beziehen: Dunlavey, "Performance-Tuning mit Kosten auf Anweisungsebene, abgeleitet von Call-Stack-Sampling", ACM SIGPLAN Notices 42, 8 (August 2007), S. 4-8.
+1 für das interessante lesen. – daveb