Wie code Profiler arbeiten?
Während ich arbeiten war auf einem Uni-Projekt habe ich eine Projekt-interne profiler, die ein ältester Schüler war es sehr einfach, aber gut genug, da seine Aufgabe war, zu subtrahieren, Zeiten zwischen zwei Punkten des Kodex und Statistik geben.
Nun, wie funktioniert eine professionelle profiler arbeiten? Es tut Vorverarbeiten der code zum einfügen von checkpoints oder ähnliches? Es tut Lesen Sie den Binär-code mit debug-Daten zu fangen, wo eine Funktion aufgerufen wird?
Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es viele verschiedene Profiler, die auf unterschiedliche Weise arbeiten.
Häufig verwendete Profiler einfach untersuchen, das laufende Programm regelmäßig, um zu sehen, was die assembly-Anweisung wird gerade ausgeführt (program counter) und die Routinen, die die aktuelle aufgerufen hat (call-stack). Diese Art von sampling profiler kann mit standard-Binärdateien, sind aber nützlich, falls Sie debugging-Symbole zu erarbeiten Zeilen code bestimmte Adressen in das Programm.
Sowie sampling regelmäßig, Sie können auch die Prozessor-Leistungsindikatoren, um die Probe nach einer bestimmten Anzahl von Veranstaltungen, wie cache misses, die Ihnen helfen, zu sehen, welche Teile des Programms sind die Verlangsamung durch Speicherzugriffe.
Anderen Profiler einbinden kompilieren Sie das Programm zu insert-Anweisungen (bekannt als instrumentation) zu zählen, wie oft jede kontinuierliche Gruppe von Anweisungen (basic blocks) ausgeführt werden, oder vielleicht sogar aufzeichnen der Reihenfolge, in der die basic blocks ausgeführt werden, oder die Aufzeichnung der Inhalte von Variablen an bestimmten Orten.
Die Instrumentierung Ansatz können Sie geben, all die Präzision und die Daten Sie könnten wollen, aber langsamer wird das Programm geändert wird, deren Leistungsmerkmale. Durch Kontrast, mit sampling-basierte Ansätze, die Sie einstellen kann, die Auswirkungen auf die Leistung gegen die Länge der Zeit, die Sie brauchen, um das Programm auszuführen, gegen die Genauigkeit der Profil-Daten, die Sie erhalten.
Gibt es zwei gängige profiling-Strategien (für VM-basierte Sprachen sowieso): Instrumentierung und Probenahme.
Instrumentierung fügt checkpoints und informiert die profiler jedes mal, wenn eine Methode gestartet und beendet. Dies kann durch die JIT/interpreter oder durch eine post-normal kompilieren, aber pre-execution-phase, die nur änderungen der ausführbaren Datei. Dies kann einen sehr signifikanten Effekt auf die Leistung (also neigen alle timing-Ergebnisse). Es ist gut für immer genaue Zählungen obwohl.
Sampling fragt die VM in regelmäßigen Abständen, was der stack trace sieht aus wie für alle threads, und aktualisiert seine Statistik so. Diese Regel wirkt sich auf die Leistung weniger, produziert aber weniger genaue Aufruf zählt.
Es hängt von der Art von code analysiert wird, zum Beispiel .NET CLR bietet Anlage für code Profiler. Beim Umgang mit managed code ist es möglich zu umschreiben intermediate code zu injizieren kundendefinierte hooks. Auch können Sie analysieren, stack-trace-Anwendungen. Betriebssystem können die Mittel, die für die Profilerstellung, zum Beispiel Windows hat Leistungsindikatoren. Beim Umgang mit embedded-code, die Sie emulieren kann/Ersatz zugrunde liegende hardware, um effektiv die Systemleistung überwachen.
Als Jon Skeet oben schrieb, gibt es zwei Strategien: die Instrumentierung und Probenahme.
Instrumentation ist sowohl manuell und auch automatisch. Im manuellen Fall: der Entwickler manuell fügt code zum track Anfang/Ende einer region der code von Interesse. Zum Beispiel ein einfaches "StartTimer" und "EndTimer". Einige profiler-tools können dies automatisch auch für diese die profiler tun müssen, wird eine statische Analyse des Codes, d.h. es analysiert den code und identifizieren wichtige Prüfpunkte wie Beginn/Ende eines bestimmten Methode(N). Dies ist besonders einfach mit den Sprachen, die Unterstützung der Reflexion (z.B. jede .net-Sprache). Mit 'Reflexion' der profiler ist in der Lage, den Wiederaufbau der gesamten source-code-tree (zusammen mit call-Graphen).
Probenahme erfolgt durch den profiler und es sieht in den binären code. Der profiler kann auch Techniken wie Haken oder Falle Windows-Ereignisse/Nachrichten für die Zwecke der Profilerstellung.
Sowohl Instrumentierung und Probenahme Methoden haben Ihre eigenen Gemeinkosten. Der Aufwand hängt - z.B. wenn die sampling-Frequenz ist zu hohe Werte, dann ist das profiling selbst kann wesentlich dazu beitragen, die Leistung berichtet wird.
Instrumentation Vs Probenahme:
Es ist nicht so, wie man besser ist als der andere Ansatz. Beide haben Ihren Platz.
Der beste Ansatz ist zu beginnen mit einer sampling-basierten profiler und schau dir das ganze system-Ebene. Ausgeführt wird der sampler und die system-weite Ressourcen-Nutzung: Speicher, Festplatte, Netzwerk, CPU.
Aus der oben identifizieren Sie die Ressourcen, die sind immer verstopft.
Mit den oben genannten Informationen, Sie können nun fügen Sie Instrumentierung um Ihren code, um pin-point die Täter. Zum Beispiel, wenn das Gedächtnis ist die am meisten verwendete Ressource, dann wird es helfen, zu instrumentieren memory allocation im Zusammenhang mit code. Beachten Sie, dass mit der Instrumentierung Sie sind wirklich konzentriert auf einen bestimmten Bereich in Ihrem code.
für gprof unter *nix, zur compile-und link-Zeit -pg einige zusätzliche code eingespritzt wird, in den Objekt-code. Dann durch ausführen von gprof, eine report-Datei erzeugt wird, durch den injizierten code.