OBS/Adminhilfe/DebugTimer

Aus OBS Wiki
Version vom 15. April 2016, 15:38 Uhr von Nimz (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „{{ZugriffOBS}} Die Klasse ''TMyDebugTimer'' aus ''G_Debug'' soll dazu dienen, die Zeiten von Funktionen zu messen und so Hinweise für mögliche Optimierungen zu …“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen
Für diese Seite wurde eine Zugriffsbeschränkung eingerichtet. Falls du diese Nachricht siehst, bist du nicht berechtigt, diese Seite einzusehen.

Dies ist eine zugriffsgeschützte Seite.


Admin-Hilfe

OBS-Administration / Installation
kundenspezifische Anpassungen
OBS Protokolle
Shop-Administration

Die Klasse TMyDebugTimer aus G_Debug soll dazu dienen, die Zeiten von Funktionen zu messen und so Hinweise für mögliche Optimierungen zu erhalten. Die Zeiten können in einer Textdatei gespeichert werden.

Verwendung

Es wird immer eine Klassenvariable des Typs TMyDebugTimer benötigt. Je nach Verwendung kann die Instanz selbst mit DebugTimerInit erstellt werden oder sie wird in DebugTimerStart automatisch erzeugt. Wichtig ist am Ende die Instanz mit MyFreeAndNil sauber zerstört und der Speicher wieder freigeben wird. Es ist daher ratsam mit try/except oder try/finally zu arbeiten. Standardmäßig werden die Zeiten im Debug-Ordner in der Datei DebugTimer.log gespeichert. Die Speicherung erfolgt mit dem Befehlt FAppendDebug. Es wird also maximal sechs Dateien mit je etwa einem Gigabyte geben. Es ist zudem möglich die Speicherung der Zeit in der Log-Datei während der Ausführung zu beeinflussen. Entweder erfolgt die durch Pointer auf globale Variablen oder mit lokalen Werten. Sollen zwischendurch Infos ebenfalls gespeichert werden, ist dies mit DebugTimerLine möglich.

besondere Datentypen

pBoolean: Pointer auf eine boolsche Variable TDebugSwitch: eigene Enummeration, welche die Werte dsGlobal (globale Variablen über Pointer), dsOff und dsOn annehmen kann. Sie dient zum Steuern der Aktivierung des Schreibens der Log-Datei. TRecDebugTimer: Record mit drei Variablen zum Speichern der Zeit. Wird nur intern in der Klasse TMyDebugTimer als Array verwendet und mus von außen nicht gesetzt werden. TMyDebugTimer: Die Klasse zur Zeiterfassung.

Beispiele

Im aktuellen Source finden sich Beispiele in G_Backup, G_Http oder lib_Shop_Interface und lib_Shop_XTCModified.

DebugTimerInit

Parameter: pBoolean, pBoolean, string='', string=''
Verwendung: Die ersten beiden Parameter müssen gesetzt werden. Da es sich um Pointer handelt ist darauf zu achten, dass Variablen mit einem @ angegeben werden. Die Pointer sind für die Speicherung wichtig. Der erste Pointer entscheidet dabei, ob die Speicherung in der angegebenen Log-Datei erfolgen soll und der Zweite steuert die zusätzliche Speicherung des Aufruf-Stacks. Die Zeichenketten sind Optional. Die erste setzt den Wert für eine erweiterte Info, die nützlich sein könnte. In G_Http ist dies z. B. die übergebene Aktion. Die zweite Zeichenkette setzt den Speichertpfad für das Protokoll neu. Beispiel:

Self.oDT := DebugTimerInit(@oSystem.lBackupDebugTimer,
                           @oSystem.lDebugCallStack,
                           '',
                           GL_EXePath+'DATA\Debug\Backup_'+cBackupNr+'.log'
                          );

DebugTimerStart

Parameter: TMyDebugTimer, string, string='', string='', TDebugSwitch=dsGlobal, TDebugSwitch=dsGlobal
Verwendung: Diese Funktion startet die Zeiterfassung für eine Ebene. Als erstes wird eine Klassenvariable des Typs TMyDebugTimer erwartet. Diese wird falls nil erstellt. Die Zeichenketten aus Parameter 3 und 4 haben nur im Falle der Erzeugung einer Instanz von TMyDebugTimer eine Relevanz. Der zweite Parameter wird ebenfalls zwingend erwartet. Die Zeichenkette sollte die Funktion, die hier gemessen werden soll eindeutig wiedergeben. Der übergebene Wert sird später in der Datei hinter BEGIN und END eingefügt. Es empfiehlt sich daher hier einfach den Namen der Funktion eventuell mit Namen der Klasse zu übergeben. Die letzte beiden Parameter sind vom Typ TDebugSwitch. Im Standard wird hier die Verwendung von globalen Variablen angenommen. Dies funktioniert nur, wenn die Pointer auch gesetzt sind. Ist dies nicht der Fall, so werden intern die Variablen zum Schreiben und dem Speichern des Callstacks auf False gesetzt. Beispiel:

DebugTimerStart(Self.oDT,
                'TShop_XTCModified.i_SetArtikelBilder',
                '[' + Self.cAction + '] (' + oSystem.UserNr + ') | ',
                Self.cOBSDir + 'debug\DebugTime.log',
                lWrite,
                dsOff
               );

DebugTimerLine

Parameter: TMyDebugTimer, string, TDebugSwitch=dsGlobal, TDebugSwitch=dsGlobal
Verwendung: Es wird eine Instanz von TMyDebugTimer und eine Zeichenkette erwartet.Die übergebene Zeichenkette wird in die Log-Datei auf die aktuelle Ebene geschrieben. Die letzten beiden Parameter vom Typ TDebugSwitch sind optional. Beispiel:

DebugTimerLine(Self.oDT,cFunc+' '+cAction);

DebugTimerEnd

Parameter: TMyDebugTimer, TDebugSwitch=dsGlobal, TDebugSwitch=dsGlobal
Verwendung: Stoppt die Zeit und trägt dies in die Datei ein. Hier ist unr die Instanz erforderlich. Die letzten beiden Parameter vom Typ TDebugSwitch sind optional. Beispiel:

DebugTimerEnd(Self.oDT);

Aufbau Datei

Die Einträge werden in der Datei ähnlich dem Sourcecode eingerückt. Start und Ende einer Funktion werden auf gleicher Ebene dargestellt. Die Zeit, welche für die Ausführung der Funktion benötigt wurde, steht immer hinter dem Ende-Eintrag. Das ganze kann dann wie folgt aussehen:

31.03.2016 19:40:38 | [000004] (037) | BEGIN Connect
31.03.2016 19:40:38 | [000004] (037) |     BEGIN i_NewFile
31.03.2016 19:40:38 | [000004] (037) |     END i_NewFile (0,005 s)
31.03.2016 19:40:38 | [000004] (037) |     BEGIN i_AddParam
31.03.2016 19:40:38 | [000004] (037) |     END i_AddParam (0,003 s)
31.03.2016 19:40:38 | [000004] (037) |     BEGIN i_AddParam
31.03.2016 19:40:38 | [000004] (037) |     END i_AddParam (0,004 s)
31.03.2016 19:40:38 | [000004] (037) |     BEGIN i_AddParam
31.03.2016 19:40:38 | [000004] (037) |     END i_AddParam (0,003 s)
31.03.2016 19:40:38 | [000004] (037) |     BEGIN i_AddParam
31.03.2016 19:40:38 | [000004] (037) |     END i_AddParam (0,002 s)
31.03.2016 19:40:38 | [000004] (037) |     BEGIN i_SendRequest
31.03.2016 19:40:41 | [000004] (037) |         BEGIN i_ReadMsg
31.03.2016 19:40:41 | [000004] (037) |         END i_ReadMsg (0,001 s)
31.03.2016 19:40:41 | [000004] (037) |     END i_SendRequest (2,335 s)
31.03.2016 19:40:41 | [000004] (037) |     BEGIN i_CheckResult
31.03.2016 19:40:41 | [000004] (037) |         BEGIN i_NewFile
31.03.2016 19:40:41 | [000004] (037) |         END i_NewFile (0,009 s)
31.03.2016 19:40:41 | [000004] (037) |     END i_CheckResult (0,025 s)
31.03.2016 19:40:41 | [000004] (037) |     BEGIN i_GetResult
31.03.2016 19:40:41 | [000004] (037) |     END i_GetResult (0,005 s)
31.03.2016 19:40:41 | [000004] (037) | END Connect (2,426 s)