Profilerstellung (Computerprogrammierung)
Im Softwareentwicklung, Profilerstellung ("Programmprofiling", "Software -Profilerstellung") ist eine Form von Dynamische Programmanalyse das misst beispielsweise den Raum (Speicher) oder die Zeit Komplexität eines Programms, das Verwendung bestimmter Anweisungen, oder die Häufigkeit und Dauer der Funktionsaufrufe. Am häufigsten dienen die Profilinginformationen zur Unterstützung Programmoptimierungund genauer gesagt, Performance Engineering.
Profilerstellung wird durch erreicht Instrumentierung Entweder das Programm Quellcode oder sein binäres ausführbares Formular mit einem Tool namens a Profiler (oder Code -Profiler). Profiler können verschiedene Techniken verwenden, wie z. B. ereignisbasierte, statistische, instrumentierte und Simulationsmethoden.
Sammeln von Programmveranstaltungen
Profiler verwenden eine Vielzahl von Techniken, um Daten zu sammeln, einschließlich Hardware unterbricht, Codeinstrumentierung, Anweisungssatzsimulation, Betriebssystem Haken, und Performance -Zähler.
Verwendung von Profilern

Programmanalyse -Tools sind äußerst wichtig für das Verständnis des Programmverhaltens. Computerarchitekten benötigen solche Tools, um zu bewerten, wie gut Programme auf Neuen funktionieren werden Architekturen. Softwareautoren benötigen Tools, um ihre Programme zu analysieren und kritische Codeabschnitte zu identifizieren. Compiler Autoren verwenden solche Tools oft, um herauszufinden, wie gut sie sind Anweisungsplanung oder Zweigvorhersage Algorithmus spielt ...
-ATOM, Pldi, '94
Die Ausgabe eines Profilers kann sein:
- Ein statistischer Zusammenfassung der beobachteten Ereignisse (a Profil)
- Zusammenfassende Profilinformationen werden häufig gegen die Quellcode -Anweisungen angegeben, in denen die Ereignisse auftreten, sodass die Größe der Messdaten linear zur Codegröße des Programms ist.
/ * ------------ Quelle ------------------------- Zählen */ 0001 Wenn x = "a" 0055 0002 dann 0003 1 zu xcount 0032 0004 sonst 0005 Wenn x = "B" 0055
- Ein Strom von aufgezeichneten Ereignissen (a verfolgen)
- Bei sequentiellen Programmen ist ein zusammenfassendes Profil normalerweise ausreichend, aber Leistungsprobleme in parallelen Programmen (Warten auf Nachrichten oder Synchronisationsprobleme) hängen häufig von der Zeitbeziehung von Ereignissen ab und erfordern so eine vollständige Spur, um ein Verständnis für das Geschehen zu erhalten.
- Die Größe einer (vollen) Spur ist linear zum Programm Anweisungspfadlängeetwas unpraktisch. Eine Spur kann daher an einem Punkt in einem Programm initiiert und an einem anderen Punkt beendet werden, um die Ausgabe zu begrenzen.
- Eine ständige Interaktion mit der Hypervisor (So kontinuierliche oder periodische Überwachung über die Bildschirmanzeige beispielsweise)
- Dies bietet die Möglichkeit, während der Ausführung eine Spur ein- oder auszuschalten, zusätzlich zu den laufenden Metriken zum (noch ausführenden) Programm. Es bietet auch die Möglichkeit, asynchrone Prozesse an kritischen Stellen auszusetzen, um die Interaktionen mit anderen parallelen Prozessen genauer zu untersuchen.
Ein Profiler kann auf eine individuelle Methode oder auf der Skala eines Moduls oder Programms angewendet werden, um Leistungs Engpässe zu identifizieren, indem der langjährige Code offensichtlich gemacht wird.[1] Ein Profiler kann verwendet werden, um Code aus zeitlicher Sicht zu verstehen, mit dem Ziel, ihn zu optimieren, um verschiedene Laufzeitbedingungen zu verarbeiten[2] oder verschiedene Lasten.[3] Profilerstellungsergebnisse können von einem Compiler aufgenommen werden, der bereitet Profilgesteuerte Optimierung.[4] Profilerstellungsergebnisse können verwendet werden, um das Design und die Optimierung eines einzelnen Algorithmus zu leiten. das Krauss Matching Wildcards Algorithmus ist ein Beispiel.[5] Profiler sind in einige eingebaut Anwendungsleistungsmanagement Systeme, die Profilerierungsdaten aggregieren, um Einblicke zu geben Transaktion Workloads in verteilt Anwendungen.[6]
Geschichte
Leistungsanalyse-Tools existierten auf IBM/360 und IBM/370 Plattformen aus den frühen 1970er Jahren, die normalerweise auf Timer -Interrupts basieren, die die aufgezeichneten Programmstatuswort . Dies war ein frühes Beispiel von Probenahme (siehe unten). Anfang 1974 Simulatoren für Anweisungen erlaubte Vollverfolgung und andere Funktionen zur Leistung der Leistung.
Profiler-gesteuerte Programmanalyse zu UNIX stammt aus dem Jahr 1973,[7] Wenn Unix -Systeme ein grundlegendes Tool enthielten, Prof.
, die jede Funktion auflistete und wie viel von der Programmausführungszeit sie verwendet hat. 1982 GPROF
erweiterte das Konzept auf eine vollständige Rufen Sie Diagramm an Analyse.[8]
1994, Amitabh Srivastava und Alan Eustace von Digital Equipment Corporation veröffentlichte ein Papier, das Atom beschreibt[9] (Analysewerkzeuge mit OM). Die Atom -Plattform wandelt ein Programm in einen eigenen Profiler um: bei Zeit kompilierenEs fügt Code in das zu analysierende Programm ein. Das eingefügte Code -Analysedaten. Diese Technik - Änderung eines Programms zur Analyse selbst - ist als "bekannt"Instrumentierung".
Im Jahr 2004 beide beides GPROF
und Atompapiere erschienen auf der Liste der 50 einflussreichsten Pldi Papiere für den Zeitraum von 20 Jahren, der 1999 endete.[10]
Profilertypen basierend auf Ausgabe
Flacher Profiler
Flat -Profiler berechnen die durchschnittlichen Anrufzeiten aus den Anrufen und brechen die Anrufzeiten nicht basierend auf dem Callee oder dem Kontext auf.
Rufen Sie Graph Profiler an
Rufen Sie Diagramm an Profiler[8] Zeigen Sie die Anrufzeiten und die Frequenzen der Funktionen sowie die auf der Callee beteiligten Anrufketten an. In einigen Tools ist der vollständige Kontext nicht erhalten.
Eingabempfindlicher Profiler
Eingangsempfindliche Profiler[11][12][13] Fügen Sie eine weitere Dimension zu flachen oder Anruf-Graph-Profilern hinzu, indem Sie Leistungsmessungen mit den Merkmalen der Eingabe-Workloads wie Eingangsgröße oder Eingangswerte in Verbindung bringen. Sie generieren Diagramme, die charakterisieren, wie sich die Leistungsstärke einer Anwendung als Funktion seiner Eingabe skaliert.
Datengranularität bei Profilertypen
Profiler, die auch selbst Programme sind, analysieren Zielprogramme, indem sie Informationen über ihre Ausführung sammeln. Basierend auf ihrer Datengranularität, auf der Profiler Informationen sammeln, werden sie in ereignisbasierte oder statistische Profiler eingeteilt. Profiler unterbrechen die Programmausführung, um Informationen zu sammeln, was zu einer begrenzten Auflösung der Zeitmessungen führen kann, die mit einem Salzkorn aufgenommen werden sollten. Grundblock Profiler melden eine Reihe von Maschinen Taktzyklen widmet sich der Ausführung jeder Codezeile oder eines Timings basierend auf dem Hinzufügen dieser zusammen; Die pro Grundblock gemeldeten Zeiten spiegeln möglicherweise keinen Unterschied zwischen wider Zwischenspeicher Hits und Misses.[14][15]
Ereignisbasierte Profiler
Die hier aufgeführten Programmiersprachen haben ereignisbasierte Profiler:
- Java: das Jvmti (JVM Tools-Schnittstelle) API, ehemals JVMPI (JVM Profiling Interface), bietet Hooks an Profiler, zum Einfangen von Ereignissen wie Aufrufen, Klassenladung, Entladen, Thread eingeben Sie Urlaub ein.
- .NETZ: Kann einen Profilierungsagenten als ein Profilagenteil anbringen Com Server zum CLR Profilerstellung API. Wie Java bietet die Laufzeit dann verschiedene Rückrufe in den Agenten, um Ereignisse wie Methode zu fangen Jit / Geben Sie / Urlaub, Objekterstellung usw. besonders leistungsfähig insofern, als der Profileragent den Bytecode der Zielanwendung auf willkürliche Weise umschreiben kann.
- Python: Python-Profiling enthält das Profilmodul, das Hotshot (das Call-Graph basiert) und die Funktion 'sys.setProfile', um Ereignisse wie C_ {call, return, ausnahmsweise}, python_ {call, return, Exception} zu fangen.
- Rubin: Ruby verwendet auch eine ähnliche Schnittstelle wie Python zum Profiling. Flat-Profiler in Profil.RB, Modul und Ruby-Prof Eine C-Extension sind vorhanden.
Statistische Profiler
Einige Profiler arbeiten nach Probenahme. Ein Stichprobenprofiler untersucht das Zielprogramm des Zielprogramms Rufen Sie Stack an in regelmäßigen Abständen verwendet Betriebssystem Interrupts. Die Stichprobenprofile sind in der Regel numerisch genau und spezifisch weniger, aber das Zielprogramm kann mit voller Geschwindigkeit ausgeführt werden.
Die resultierenden Daten sind nicht genau, sondern eine statistische Annäherung. "Die tatsächliche Fehlermenge beträgt normalerweise mehr als eine Stichprobenperiode. Wenn ein Wert der Stichprobenperiode in der Tat ist, ist der erwartete Fehler darin die Quadratwurzel der N-Stichprobenperioden."[16]
In der Praxis können Abtastprofiler häufig ein genaueres Bild der Ausführung des Zielprogramms liefern als andere Ansätze, da sie nicht so aufdringlich für das Zielprogramm sind und daher nicht so viele Nebenwirkungen haben (z. B. auf Speicher -Caches oder Anweisungen Dekodierpipelines). Da sie die Ausführungsgeschwindigkeit nicht so stark beeinflussen, können sie Probleme erkennen, die sonst versteckt wären. Sie sind auch relativ immun gegen die Überprüfung der Kosten kleiner, häufig bezeichneter Routinen oder "enger" Schleifen. Sie können den relativen Zeitaufwand im Benutzermodus im Vergleich zu einem unterbrochenen Kernel -Modus wie z. B. zeigen Systemanruf wird bearbeitet.
Der Kernelcode zur Verarbeitung der Interrupts beinhaltet jedoch einen geringfügigen Verlust von CPU-Zyklen, umgeleitete Cache-Verwendung und kann die verschiedenen Aufgaben nicht unterscheiden, die in ununterbrochenem Kernelcode (Aktivität der Mikrosekunden-Reichweite) auftreten.
Dedizierte Hardware können darüber hinausgehen: ARM Cortex-M3 und einige neuere MIPS-Prozessoren JTAG-Schnittstelle haben ein PC-Beispielregister, das die Stichproben probiert Programm zähler Auf eine wirklich unhandliche Weise, um eine nicht störende Sammlung eines flachen Profils zu ermöglichen.
Einige üblicherweise verwendet[17] Statistische Profiler für Java/Managed Code sind Smartbear -Software's AQtime[18] und Microsoft's CLR -Profiler.[19] Diese Profiler unterstützen auch native Codeprofile zusammen mit Apple Inc.'s Hai (OSX),[20] Oprofile (Linux),[21] Intel Vtune und paralleler Verstärker (Teil von Intel Parallel Studio), und Orakel Leistungsanalysator,[22] unter anderen.
Instrumentierung
Diese Technik fügt dem Zielprogramm effektiv Anweisungen hinzu, um die erforderlichen Informationen zu sammeln. Beachten Sie, dass Instrumentierung Ein Programm kann Leistungsänderungen verursachen und in einigen Fällen zu ungenauen Ergebnissen führen und/oder Heisenbugs. Der Effekt hängt davon ab, welche Informationen gesammelt werden, auf die Ebene der angegebenen Zeitdetails und davon, ob das grundlegende Blockprofiling in Verbindung mit Instrumenten verwendet wird.[23] Beispielsweise hat das Hinzufügen von Code, um jeden Verfahren/Routine -Aufruf zu zählen, wahrscheinlich weniger Auswirkungen als zu zählen, wie oft jede Aussage befolgt wird. Einige Computer verfügen über spezielle Hardware, um Informationen zu sammeln. In diesem Fall sind die Auswirkungen auf das Programm minimal.
Die Instrumentierung ist der Schlüssel zur Bestimmung des Kontrollniveaus und der Zeitauflösung, die den Profilern zur Verfügung stehen.
- Handbuch: Durch den Programmierer ausgeführt, z. Durch Hinzufügen von Anweisungen zur expliziten Berechnung von Laufzeiten, zählen Sie einfach Ereignisse oder Aufrufe zur Messung Apis so wie die Anwendungsantwortmessung Standard.
- Automatische Quellenebene: Instrumentierung, die dem Quellcode durch ein automatisches Tool gemäß einer Instrumentenrichtlinie hinzugefügt wurden.
- Zwischensprache: Instrumentierung hinzugefügt zu Montage oder zerlegt Bytecodes Unterstützung mehrerer Quellsprachen auf höherer Ebene und Vermeidung von (nicht symbolischen) Binärversetzungsproblemen.
- Compiler unterstützt
- Binäre Übersetzung: Das Tool fügt einem zusammengestellten Instrumentierung hinzu ausführbar.
- Laufzeitinstrumentierung: Direkt vor der Ausführung ist der Code instrumentiert. Der Programmlauf wird vom Tool vollständig überwacht und gesteuert.
- Laufzeitinjektion: Leichter als Laufzeitinstrumentation. Der Code wird zur Laufzeit geändert, um Sprünge zu Helferfunktionen zu haben.
Interpreterinstrumente
- Interpreter -Debug Optionen können die Sammlung von Leistungsmetriken ermöglichen, wenn der Interpreter auf jede Zielaussage trifft. EIN Bytecode, Steuerungstabelle oder Jit Dolmetscher sind drei Beispiele, die normalerweise die vollständige Kontrolle über die Ausführung des Zielcodes haben und so extrem umfassende Datenerfassungsmöglichkeiten ermöglichen.
Hypervisor/Simulator
- Hypervisor: Die Daten werden gesammelt, indem das (normalerweise) unmodifizierte Programm unter a ausgeführt wird Hypervisor. Beispiel: Simmmon
- Simulator und Hypervisor: Daten, die interaktiv und selektiv erfasst werden, indem das nicht modifizierte Programm unter einem ausgeführt wird Anweisungssatz Simulator.
Siehe auch
- Algorithmische Effizienz
- Benchmark
- Java -Leistung
- Liste der Leistungsanalyse -Tools
- Papi ist eine tragbare Schnittstelle (in Form einer Bibliothek) für Hardware -Performance -Zähler auf modernen Mikroprozessoren.
- Performance Engineering
- Leistungsvorhersage
- Leistungsstimmung
- Laufzeitüberprüfung
- Profilgesteuerte Optimierung
- Statische Codeanalyse
- Softwarearchäologie
- Worst-Case-Ausführungszeit (WCET)
Verweise
- ^ "Wie finde ich den Performance -Engpass in C# Desktop -Anwendung?". Paketüberfluss. 2012.
- ^ Krauss, Kirk J (2017). "Performance -Profilerstellung mit Fokus". Für die Leistung entwickeln.
- ^ "Was ist Codeprofile? Lernen Sie die 3 Arten von Codeprofilern". Stapeln Sie Entwicklertipps, Tricks und Ressourcen. Disqus. 2016.
- ^ Lawrence, Eric (2016). "Erste Schritte mit profilführender Optimierung". Testslashplain. WordPress.
- ^ Krauss, Kirk (2018). "Matching Wildcards: Ein verbesserter Algorithmus für Big Data". Für die Leistung entwickeln.
- ^ "Liste der .NET -Profiler: 3 verschiedene Typen und warum Sie alle brauchen". Stapeln Sie Entwicklertipps, Tricks und Ressourcen. Disqus. 2016.
- ^ UNIX -Programmierhandbuch, 4. Auflage
- ^ a b S.L. Graham, P.B. Kessler und M.K. McKusick, GPROF: Ein Call -Graph -Ausführungsprofiler, Proceedings des Sigplan '82 Symposium über Compiler Construction, Sigplan Mitteilungen, Vol. 17, Nr. 6, S. 120-126; doi: 10.1145/800230.806987
- ^ A. Srivastava und A. Eustace, Atom: Ein System zum Erstellen maßgeschneiderter Programmanalyse -Tools, Proceedings der ACM-Sigplan-Konferenz zum Entwurf und der Implementierung von Programmiersprache (PLDI '94), S. 196-205, 1994; ACM Sigplan merkt - Best of PLDI 1979-1999 Homepage Archive, Vol. 39, Nr. 4, S. 528-539; doi: 10.1145/989393.989446
- ^ 20 Jahre PLDI (1979–1999): eine Auswahl, Kathryn S. McKinley, Editor
- ^ E. Coppa, C. Demetrescu und I. Finocchi, Eingangsempfindliche Profilerstellung, IEEE Trans. Software Eng. 40 (12): 1185-1205 (2014); doi: 10.1109/tse.2014.2339825
- ^ D. Zaparanuks und M. Hauswirth, Algorithmische Profilerstellung, Proceedings der 33. ACM -Sigplan -Konferenz zum Entwurf und der Implementierung von Programmiersprache (PLDI 2012), ACM Sigplan Notices, Vol. 3, No. 47, Nr. 6, S. 67-76, 2012; doi: 10.1145/2254064.2254074
- ^ T. Kustner, J. Weidendorfer und T. Weinzierl, Argument kontrollierte Profilerstellung, Proceedings of Euro-Par 2009-Parallele Processing Workshops, Vorlesungen in Informatik, Vol. 3, No. 6043, S. 177-184, 2010; doi: 10.1007/978-3-642-14122-5 22
- ^ "Timing und Profilerstellung - Grundlegende Blockprofiler". OpenStax CNX -Archiv.
- ^ Ball, Thomas; Larus, James R. (1994). "Optimal Profiling- und Verfolgungsprogramme" (PDF). ACM -Transaktionen zu Programmiersprachen und Systemen. ACM Digitale Bibliothek. 16 (4): 1319–1360. doi:10.1145/183432.183527. S2CID 6897138. Archiviert von das Original (PDF) Am 2018-05-18. Abgerufen 2018-05-18.
- ^ Statistische Ungenauigkeit von
GPROF
Ausgabe Archiviert 2012-05-29 bei der Wayback -Maschine - ^ "Populär C# Profiler". Gingtage. 2014.
- ^ "Probenahmeprofiler - Übersicht". AQTime 8 Referenz. Smartbear -Software. 2018.
- ^ Wenzal, Maira; et al. (2017). "Profiling -Übersicht". Microsoft .NET Framework Unmanaged API Referenz. Microsoft.
- ^ "Performance Tools". Apple Developer Tools. Apple, Inc. 2013.
- ^ Netto, Zanella; Arnold, Ryan S. (2012). "Bewerten Sie die Leistung für Linux auf Strom". IBM Developerworks.
- ^ Schmidl, Dirk; Terboven, Christian; ein Mey, Dieter; Müller, Matthias S. (2013). Eignung von Leistungstools für OpenMP-Task-Parallel-Programme. Proc. 7. INT'L Workshop zu parallele Tools für Hochleistungs -Computing. S. 25–37. ISBN 9783319081441.
- ^ Carleton, Gary; Kirkegaard, Knud; Sehr, David (1998). "Profilgesteuerte Optimierungen". Dr. Dobbs Journal.
Externe Links
- Artikel "Geschwindigkeitsbedürfnis - eliminierende Leistungs Engpässe beseitigen"Bei der Ausführungszeitanalyse von Java -Anwendungen mit IBM Rational Application Developer.
- Profilerstellung der Laufzeit generierte und interpretierte Code mit dem Vtune Performance Analyzer