Profiler (Programmierung)

Als Profiler werden Programmierwerkzeuge bezeichnet, die das Laufzeitverhalten von Software analysieren. Es gibt unterschiedliche Problembereiche in der Softwareentwicklung, die durch ineffiziente Programmierung ausgelöst werden. Ein Profiler hilft dem Entwickler durch Analyse und Vergleich von laufenden Programmen die Problembereiche aufzudecken. Daraus kann man Maßnahmen zur strukturellen und algorithmischen Verbesserung des Quellcodes ableiten.

Bereiche des Profilings

Messen von Geschwindigkeit

Die häufigste Anwendung eines Profilers ist das Zählen und Messen der Aufrufe und Durchläufe von Funktionen. Dies ermöglicht es dem Programmierer herauszufinden, wo sich eine Optimierung des Programms lohnt. Eine Optimierung von Funktionen, die nicht häufig verwendet werden, ist der Gesamtleistung des Programms nicht sonderlich zuträglich und erschwert in der Regel die Wartbarkeit des Quellcodes. Deshalb wird das Hauptaugenmerk auf Funktionen gelegt, die oft aufgerufen werden und in der Summe der Aufrufe viel Zeit benötigen.

Speichernutzung

Ein weiterer Aspekt ist die Verfolgung von Speichernutzung durch ein Programm. Der Profiler soll dabei helfen, den Ge- und Verbrauch von Arbeitsspeicher zu optimieren und ggf. Fehler in der Programmierung aufzudecken, durch die ungenutzte Speicherbereiche nicht freigeben werden (Speicherleck).

Nebenläufigkeit

Moderne Profiler bieten die Möglichkeit, nebenläufige Prozesse (Threads) in ihrem Lebenszyklus grafisch (zum Beispiel als Balken- oder Netzdiagramm) darzustellen. Diese optische Aufbereitung soll einem Programmierer helfen, das Laufzeitverhalten von nebenläufigen Prozessen besser zu interpretieren und Fehler durch Verklemmung (Deadlock) aufzudecken.

Technische Aspekte des Profilings

Das Profiling eines Programms selbst verursacht in der Regel eine Beeinflussung der zu analysierenden Anwendung. Üblicherweise verlangsamt der Profiler selbst die Ausführungsgeschwindigkeit. Außerdem entsteht bei Analysen von großen Programmen eine sehr große Menge an Daten. Es gibt unterschiedliche Techniken beim Profiling, die eine solche Beeinflussung, ggf. unter Verlust der Analysegenauigkeit, verschieden stark ausprägen. Außerdem ermöglichen die Profiler es zu bestimmen, welche Programmteile überhaupt analysiert werden sollen.

Statistische Auswertung

Mittels der statistischen Auswertung wird die Programmanalyse nicht exakt mit jedem Programmbefehl einer Messung unterzogen. Es wird vielmehr in einem bestimmten zeitlichen Zyklus die Laufzeit gemessen. Dieses Verfahren nennt man auch Sampling. Der Profiler greift damit in bestimmten Taktzyklenabständen in den Programmablauf ein und ermittelt damit stichprobenartig, welche Programmteile seit dem letzten Zyklus aufgerufen wurden. Daraus wird ein statistischer Mittelwert errechnet, der in das Ergebnis der Analyse einfließt.

Bei der statistischen Auswertung wird das laufende Programm nicht verändert.

Instrumentierung

Mit der Instrumentierung werden vom Anwender bestimmte (oder gar alle) Programmabschnitte (zum Beispiel während der Laufzeit) mit Analysecode erweitert. Das heißt, es werden in das Programm Unterbrechungs-Marken (Interrupts) oder Programmcode eingefügt, die dem Profiler während des Programmlaufs signalisieren, dass der Abschnitt gerade abgearbeitet wird. Die Zeit zwischen den Aufrufen der Analysepunkte (sowie das Speicherverhalten als Differenz zu einem vorherigen Durchlauf) können wieder als Laufzeitwerte in das Ergebnis der Analyse einfließen.

Die Instrumentierung verändert also das Programm, um die Analysedaten zu berechnen.

Es gibt verschiedene Typen der Instrumentierung:

  • Manuelle Instrumentierung durch Erweiterung des Quelltextes durch Befehle, die die Laufzeit berechnen (z. B. mit der Programmierschnittstelle des Application-Response-Measurement-Standards).
  • Durch Compiler-Optionen erweiterte Programme, die dadurch Profiler-Marken erhalten.[1]
  • Nachträgliche Veränderung von kompilierten Programmen durch Einfügen von Marken.
  • Laufzeit-Instrumentierung: Dabei bleibt das gespeicherte Programm unangetastet. Die Profiler-Marken werden vor dem Ausführen im Arbeitsspeicher hinzugefügt.

Profil-Abbilder

Ziel einer Programmanalyse ist ein effizientes Laufzeitverhalten der Anwendung. Damit ein Vergleich auch objektiv gelingt, ermöglichen viele Profiler die gesammelten Analysedaten zu speichern und zu vergleichen. Somit können Programmänderungen in ihrem Laufzeitverhalten verglichen und bewertet werden. Die Profiler zeigen die Vergleichswerte üblicherweise relativ als Prozentangaben oder als absolute Werte an. Da aber ein Profiler das Laufzeitverhalten während der Analyse immer selbst beeinträchtigt, dürfen solche Vergleichswerte nicht als tatsächliche Veränderung betrachtet werden.

Software

  • gprof
  • PerfTools
  • Der Prozess-Scheduler Slurm besitzt ebenfalls Profiling-Möglichkeiten.
  • ProDelphi ist ein Profiler für Delphi (Objekt-Pascal)
  • ProLaza ist ein Profiler für Lazarus (Objekt-Pascal)
  • CODESYS Profiler ist für IEC 61131-3 Code (z. B. Strukturierter Text) entwickelt mit CODESYS

Siehe auch

Einzelnachweise

  1. gcc/g++ -finstrument-functions Compiler-Option gcc.gnu.org, abgerufen am 22. Januar 2016.