Mit den zuvor aufgelisteten Debugging-Techniken und der Ausgabe von Objektzuständen zur Laufzeit, kann man zwar Programmfehler herausfinden, jedoch sind sie keine Hilfe bei Performance-Problemen.
Zur Untersuchung von Performanceproblemen verwenden Sie die Komponente gip.core.autocomponent.RuntimeDump, die Sie als Instanz in einem Anwendungsbaum hinzufügen. RuntimeDump darf bei einem gestarteten iPlus-Dienst nur einmal instanziiert werden. Deswegen empfehlen wir die Instanz im Service-Projekt mit dem ACIdentifer "VBDump" hinzuzufügen:
Zeigen Sie VBDump in der Visualisierung an damit Sie folgende Befehle per Kontextmenü ausführen können:
Dump CPU usage
Dieses Kommando erstellt eine Datei mit dem Namen "UsageCPU_YYYYMMDD_hhmmss.txt" im temporären Verzeichnis (%USERPROFILE%\AppData\Local\Temp) wo auch das Meldungsprotokoll abgelegt wird. Hier eine Beispieldatei:

Diese Datei gibt eine Statistik über alle Threads aus, die mit der Klasse "gip.core.datamodel.ACThread" erzeugt worden sind. Deswegen sollten Sie bei der Threadprogrammierung ausschliesslich die Klasse ACThread verwenden.
- Im Abschnitt <<< SUMMARY >>> werden die Threads nach prozentualer Nutzung ausgegeben.
- Im Abschnitt <<< DETAILS >>> wird pro Thread die "Top 20"-Ereignisse ausgegeben, die am meisten CPU-Zeit beansprucht haben.
- Darunter werden die Statistiken von allen Delegate-Queues ausgegeben.
- Im Abschnitt <<< THREAD-STATES >>> wird der Threadzustand ausgegeben.
- Im Abschnitt <<< MAPPING MANAGED-Id to NATIVE-Id >>> wird das Mapping zwischen der Managed-ThreadID und der "native Thread-ID" ausgegeben. Dies ist nützlich, wenn man mit dem Process-Explorer das Verhalten der Thread-Nutzung beobachtet hat und dann herausfinden will welcher .NET-Thread sich dahinter verbirgt.
Dump Performancelog
Dieses Kommando erstellt eine Datei mit dem Namen "PerfLog_YYYYMMDD_hhmmss.txt" im temporären Verzeichnis (%USERPROFILE%\AppData\Local\Temp) wo auch das Meldungsprotokoll abgelegt wird. Hier eine Beispieldatei:

Diese Datei enthält eine Nutzungs-Statistik über alle Instanzen, die Status-Abhängigen Methoden besitzen. Status-Abhängige Methoden werden zyklisch aufgerufen durch die Aktivierung per "PABase.SubscribeToProjectWorkCycle()". Die Ausführungszeit einer Status-Abhängigen Methode wird protokolliert und in diesem Performancelog ausgegeben.
- Im Abschnitt <<< SUMMARY >>> werden die Status-Abhängigen Methoden nach prozentualer Nutzung ausgegeben.
- Im Abschnitt <<< DETAILS >>> wird pro Methode die "Top 20"-Ereignisse ausgegeben, die am meisten CPU-Zeit beansprucht haben.
Enable/Disable Performance-logging
Damit aktivieren oder deaktivieren Sie das Performance-logging. Um es dauerhaft beim Startvorgang des Dienstes zu aktivieren, tragen Sie den Abschnitt PerfLogConfiguration in der App.Config-Datei hinzu.
Dump Delegate-Queues
Dieses Kommando erstellt eine Datei mit dem Namen "DelegateQueue_YYYYMMDD_hhmmss.txt" im temporären Verzeichnis (%USERPROFILE%\AppData\Local\Temp) wo auch das Meldungsprotokoll abgelegt wird. Hier eine Beispieldatei:

Diese Datei enthält eine Statistik über den Status und den Nutzungsgrad aller Delegate-Queues.
Restart Delegate-Queue
Dieses Kommando entfernt alle Einträge aus allen Delegate-queues und startet die Abarbeitungsthreads erneut.
Dump all subscribed components
Dieses Kommando erstellt eine Datei mit dem Namen "SubscribedComp_YYYYMMDD_hhmmss.txt" im temporären Verzeichnis (%USERPROFILE%\AppData\Local\Temp) wo auch das Meldungsprotokoll abgelegt wird. In dieser Datei sind alle Instanzen aufgelistet, deren Status-Abhängige Methoden zyklisch aufgerufen werden, weil Sie per "PABase.SubscribeToProjectWorkCycle()" aktiviert wurden.
Full Dump
Legen Sie im iPlus-Installationsverzeichnis bzw. im Verzeichnis wo der iPlus-Dienst ausgeführt wird eine leere Textdatei mit dem Namen "Invoke_Dump.txt" an.
Der iPlus-Dienst beginnt alle Anwendungsbäume inklusive des iPlus-Anwendungsbaums in das temporäre Verzeichnis auszugeben. Dabei wird eine XML-Datei mit dem Namen "RuntimeDump_ProcId_yyyyMMdd_HHmmss.xml" erstellt. Die XML-Datei enthält alle Instanzen inklusive aller Eigenschaftswerte und privater Felder wie sie auch im Diagnose-Dialog angezeigt wird.
Zusätzlich wird im Meldungsprotokoll der aktuelle Call-Stack aller Threads ausgegeben.
Dieser Dump ist vorteilhaft, falls der komplette iPlus-Dienst hängt und man vom Client aus keine Befehle mehr an den Dienst senden kann. Dieser Zustand tritt nur in den seltensten Fällen auf und zwar dann, wenn eine eigens entwickelte Assembly verwendet wird, die nicht threadsicher programmiert wurde.
Vergessen Sie nicht die "Invoke_Dump.txt"-Datei wieder aus dem Verzeichnis zu löschen, nachdem die XML-Datei erstellt worden ist!
Hier eine Beispieldatei:
