
Die Veröffentlichung enthält eine Softwareimplementierung integrierter Tools zum Sammeln und Sammeln von Metrikinformationen zur Laufzeit von Anwendungen, die in C / C ++ / C # geschrieben wurden.
Der Kern des beschriebenen Ansatzes basiert auf der Aufnahme von „Kontrollpunkten“ in den Programmcode der Anwendung zum Extrahieren von Daten zur Ausführungszeit von Strukturkomponenten: Methoden, Funktionen und {} Blöcke. Die extrahierten Metrikinformationen werden in einer internen Datenbank gesammelt, deren Inhalt am Ende der Anwendung in ein in einer Datei gespeichertes Textberichtsformular konvertiert wird. Die Angemessenheit der Verwendung der Mittel zur integrierten Steuerung der Ausführungszeit beruht auf der Notwendigkeit, Problembereiche des Codes zu identifizieren, die Ursachen für die vorübergehende Verschlechterung der Anwendung zu analysieren: vollständig oder teilweise oder auf bestimmten Sätzen von Quelldaten zu manifestieren.
Die angegebenen C ++ / C # -Quellcodebeispiele zeigen mögliche Implementierungen des beschriebenen Ansatzes.
Einführung
Die Entwicklung einer Softwareanwendung bei jeder Iteration (z. B. der Veröffentlichung der nächsten Version) ihrer evolutionären Entwicklung umfasst die folgenden grundlegenden Schritte:
- Entwicklung und Erprobung von Funktionen;
- Optimierung der verbrauchten RAM-Ressourcen;
- Stabilisierung von Laufzeitmetriken.
Diese Schritte erfordern eine erhebliche Anzahl von Entwicklern, die nicht nur kreativ sind (wie die Entwicklung und Implementierung effektiver Algorithmen, die Erstellung einer flexiblen Softwarearchitektur usw.), sondern auch Routinearbeiten. Die letztere Kategorie umfasst Aktivitäten zur Stabilisierung von Zeitmetriken für die Anwendungsausführung. In vielen Fällen ist dies ein ziemlich schmerzhafter Vorgang, wenn Entwickler mit einer Verschlechterung konfrontiert sind. Dies ist eine Folge der Erweiterung der Funktionalität des Softwareprodukts, der Neuerstellung der Softwarearchitektur und des Auftretens neuer Threads in der Anwendung. Gleichzeitig erfordern die Ursachen der Verschlechterung bestimmte Anstrengungen, um sie zu erkennen, was nicht nur durch die hohe Fleißigkeit und Verantwortung der Entwickler (notwendige Bedingung), sondern auch durch die Zusammensetzung der für diese Zwecke verwendeten Werkzeuge (ausreichende Bedingung) erreicht wird.
Einer der effektiven Ansätze zur Lösung des Problems der Analyse von Anwendungszeitmetriken ist die Verwendung spezialisierter Softwareprodukte, beispielsweise GNU
gprof . Durch die Analyse von Berichten, die mit solchen Tools erstellt wurden, können Sie „Engpässe“ (Klassenmethoden und -funktionen) identifizieren, die einen erheblichen Zeitaufwand für die Ausführung der gesamten Anwendung ausmachen. Gleichzeitig wird die Gültigkeit der Zeit, die für die Ausführung von Methoden und Verfahren aufgewendet wird, sicherlich von den Entwicklern qualifiziert.
Es ist auch zu beachten, dass die Softwareprodukte dieser Klasse in der Regel eine metrische Analyse der Ausführungszeit des Programmcodes auf den Ebenen der Methoden von Klassen und Funktionen durchführen, wobei die niedrigeren (vom Standpunkt der Problemanalyse jedoch signifikanten) Ebenen ignoriert werden:
{...}, z. während, bis, wenn - sonst, Try-Catch- Blöcke, innerhalb derer keine weniger bedeutenden Ausgaben für die Ausführungszeit anfallen.
Als nächstes wird der Hauptinhalt einer der möglichen Lösungen für die Implementierung integrierter Laufzeitsteuerungswerkzeuge betrachtet, die darauf abzielen, detaillierte Informationen über Zeitmetriken von gesteuerten Softwareblöcken mit anschließender Erstellung von Berichten für Entwickler zu extrahieren und zu sammeln.
Methoden zum Abrufen von Laufzeitdaten
Die Funktionalität jeder Softwareanwendung kann als
abstrakte Maschine mit einer endlichen Menge eindeutiger
Zustände {St} und Übergängen
{Tr} zwischen ihnen interpretiert werden.
Im Rahmen dieses Ansatzes sollte jeder Ausführungsfluss in der Anwendung als eine geordnete Folge ihrer Zustände und Übergänge zwischen ihnen interpretiert werden. In diesem Fall wird die Schätzung der Ausführungszeitkosten durchgeführt, indem die Zeitmetriken über den gesamten Satz übergebener Zustände summiert werden, wobei die Kosten für Übergänge von einem Zustand in einen anderen ignoriert werden - als vernachlässigbare Werte.
Das Extrahieren und Sammeln von Daten zur Anwendungsausführungszeit an den angegebenen Kontrollpunkten ist die Hauptaufgabe, die von den nachstehend beschriebenen integrierten Steuerungswerkzeugen gelöst wird.
Für jeden im Quellcode durch Platzieren deklarierten Haltepunkt
PROFILE_ENTRY C ++ - Makro, die Anzahl seiner Durchläufe während der Anwendungsausführung sowie die Zeitmetrik - die Gesamtzeit, in der sich die Anwendung im Zustand befand, ab dem Zeitpunkt, an dem der Prüfpunkt an die nächste Ebene der Programmhierarchie übergeben wurde (einschließlich Block, Klassenmethode, Funktion usw.). wie in der folgenden Abbildung dargestellt.
Die Steuerung der Kontrollpunkte (Erstregistrierung und Berechnung ihrer
Zeitmetriken ) erfolgt durch das Objekt
'timeManager' , das in einer einzelnen Instanz erstellt wird. Jedes Ereignis beim Übergeben des Prüfpunkts wird durch das Objekt
'timeManager' festgelegt und während des ersten Durchlaufs von ihm als Observables als
'registerEntry' registriert .
Bei jedem Durchlaufen des Kontrollpunkts wird ein
timerObject- Objekt
erstellt , das den Zeitpunkt seiner Erstellung
festlegt . Die Ausführungszeit wird am Prüfpunkt festgelegt, wenn die Anwendung die aktuelle Ebene der Softwarehierarchie verlässt. In diesem Moment wird das timerObject des Objekts automatisch zerstört, was mit der Berechnung seiner "Lebensdauer" T
einhergeht. Infolgedessen erhöht der
timeManager die
Häufigkeit , mit der der Prüfpunkt passiert, und die Zeit, die
T. in ihm verbringt
. Für alle festgelegten Kontrollpunkte sammelt
timeManager Daten mit der anschließenden Veröffentlichung eines Berichts, wenn die Anwendung beendet wird.

Unten finden Sie den C ++ - Quellcode, der die integrierten Tools zur Steuerung der Ausführungszeit der Anwendung implementiert.
Die Struktur der Demoanwendung ist unten dargestellt und zeigt die Verwendung der integrierten Laufzeitsteuerungstools als Beispiel sowie eine Tabelle der erzielten Ergebnisse (Einzelheiten siehe
Anhang 1. Quellcode der Demoanwendung ).


Abschnitt
Nachtrag 2. Der Quellcode der Mittel der eingebauten Steuerung der Ausführungszeit der C # -Anwendung zeigt eine ähnliche Implementierung der Mittel der eingebauten Steuerung in C #.
Der Autor verwendet Paare von
TimeWatcher.StartWatch () und
TimeWatcher.StopWatch () , um die Ausführungszeit mühsamer (aus rechnerischer Sicht) Methoden und Verfahren im Rahmen des von
EREMEX entwickelten Software-Produkts
Delta Design - einem computergestützten Konstruktionssystem für elektronische Geräte - zu
analysieren .
Unten finden Sie ein Beispiel für einen kurzen Bericht über Zeitmetriken einer der Funktionen des genannten Produkts.
Kurze Schlussfolgerungen
Die beschriebenen Tools können verwendet werden, um Daten zur Ausführungszeit von Anwendungen in verschiedenen Teilen des Programmcodes zu erfassen. Insbesondere ermöglichen sie Folgendes:
- Sammeln und Sammeln von Daten zu Zeitmetriken von Ausführungsthreads in der Anwendung;
- Schätzungen der Ausführungszeit von Programmcode durchführen, die auf elementare Sprachkonstrukte genau sind;
- Verwalten Sie das Volumen der extrahierten Daten, indem Sie die integrierten Steuerungswerkzeuge in den entsprechenden Abschnitten der Anwendungsausführungsabläufe ein- und ausschalten
- Entwicklung und Anwendung von Regressionstests, die die Stabilität (und die Verschlechterung) von Anwendungszeitmetriken überwachen.
Zusammenfassend ist anzumerken, dass außerhalb des Umfangs dieser Veröffentlichung Fragen zur Verwendung der beschriebenen integrierten Steuerungswerkzeuge im Zusammenhang mit
Multithreading- Anwendungen
auftraten und keine Analyse der Genauigkeit der erhaltenen Daten anhand von Zeitmetriken in irgendeiner Form vorgelegt wurde. Letzteres ist darauf zurückzuführen, dass in der Praxis bei der Ermittlung der Ursachen für die vorübergehende Verschlechterung einer
Anwendung in erster Linie die Daten zur
relativen Verteilung der Ausführungszeitkosten zwischen den Softwarekomponenten der Anwendung relevant sind
. In diesem Zusammenhang treten Fragen nach der Genauigkeit der erhaltenen Daten in den Hintergrund.
Anhang 1. Quellcode für die Demo-Anwendung
INITIALIZE_PROFILER int main(int argc, char * argv[]) {
Ergänzung 2. Quellcode der integrierten C # -Anwendungen zur Laufzeitsteuerung