Freigeben über


Profilerstellung mit der ELT-API

Ablaufverfolgungsprofiler protokollieren das Starten und Verlassen von Funktionen und können auch historische Aufrufdiagramme verwalten. Zur Implementierung der Funktion bietet .NET Framework globale statische Funktionen für Profilerstellung, die Sätze von verwandten Funktionen und Schnittstellen enthalten, die als enter/leave/tailcall (ELT)-APIs bekannt sind.

Vor .NET Framework, Version 4 traten bei der Ablaufverfolgung für Profiler, die ELT-Funktionen verwendeten, Leistungseinbußen auf, die sich mit steigender Anzahl verwalteter Funktionen verstärkten. Ab .NET Framework 4 können Sie mit der ELT-API, Version 3 (ELT3), Verbesserungen der ELT-Leistung erzielen, insbesondere wenn Argumente oder Rückgabe nicht überprüft werden müssen. Folgende Maßnahmen dienen zur Leistungsverbesserung:

  • Die Größe des Just-In-Time kompilierten Codes nimmt für schnelle ELT-Funktionen ab.

  • Die Anzahl der erforderlichen ELT-Argumente wird auf ein Minimum reduziert, das Stapelspeicheranforderungen für Parameter verringert, die an den Profiler übergeben werden.

  • Die Stapelrahmeneinstellungen und Argumentüberprüfung treten nur auf, wenn sie benötigt werden, wodurch die Ausführungsgeschwindigkeit erhöht wird.

  • Stapelrahmen- und Argumentinformationen werden verzögert initialisiert, wenn eine neue ICorProfilerInfo3-Methode aufgerufen wird.

ELT3-Schnittstellen sind in früheren Versionen von .NET Framework mit den ELT-Schnittstellen (ELT1 und ELT2) kompatibel.

.NET Framework 4 implementiert ELT2-Funktionen auf ELT3 und verwendet eine zusätzliche Hashtabelle, um eine Zuordnung zwischen Client-IDs und Funktion-IDs zu bilden. Dies führt zu beträchtlichem Synchronisierungsaufwand und langsamer Profilerstellung, wenn die ELT2-Funktionen verwendet werden. Die Leistungseinbußen sind bei stark ausgelasteten Mehrprozessorcomputern noch stärker. Allerdings sind die erforderlichen Codeänderungen zum Migrieren eines Profilers auf die ELT3-API einfach und unaufwendig, sodass empfohlen wird, aus Leistungsgründen ELT3 zu verwenden.

ELT3-Funktionen und -Methoden

Die ELT3-API stellt drei Typen von Membern bereit:

  • Benachrichtigungsfunktionen, die von der CLR aufgerufen werden, um einen Profiler zu benachrichtigen, dass die Steuerung an eine Funktion in der Zielanwendung übergeben wird.

  • Registrierungsmethoden, die vom Profiler aufgerufen werden, um entweder schnelle oder langsame Überprüfungsmethoden zu aktivieren.

  • Überprüfungsmethoden, die vom Profiler aufgerufen werden, um Argument- oder Rückgabewertinformationen abzurufen.

ELT3-Benachrichtigungsfunktionen

Ab .NET Framework 4 können Sie drei von sechs ELT3-Benachrichtigungsfunktionen verwenden, um den Profiler zu benachrichtigen, dass die Steuerung an eine Funktion in der Zielanwendung übergeben wird (die Anwendung, für die ein Profil erstellt wird). Die ELT3-Benachrichtigungsfunktionen bestehen aus schnellen und langsamen Funktionen:

  • Schnelle Funktionen sind durch JIT-kompilierten Code gekennzeichnet, der Aufrufe direkt in die ELT-Methoden des Profilers ohne Zwischencode ausführt.

  • Langsame Funktionen sind durch JIT-kompilierten Code gekennzeichnet, der einen Aufruf in einen Zwischencode ausführt (normalerweise eine Kombination aus Assemblycode und C-Code, die in die CLR-DLL kompiliert werden), bevor schließlich ein Aufruf in die ELT-Methoden des Profilers stattfindet.

Die folgenden drei Funktionen sind schnelle Funktionen und erfordern nur einen Parameter, nämlich den Bezeichner der Funktion, an den die Steuerung übergeben oder zurückgegeben wird, bzw. den Parameter, der im Begriff ist, einen Endeaufruf auszuführen:

Die folgenden drei Funktionen sind langsame Funktionen und erfordern zwei Parameter, den Funktionsbezeichner und ein Handle für Informationen zu einem Stapelrahmen:

In diesen drei Funktionen ist der zweite Parameter (eltInfo), den die Laufzeit an den Profiler übergibt, ein nicht transparenter Zeiger auf eine _COR_PRF_ELT_INFO_INTERNAL-Struktur, die auf dem Stapel zugeordnet wird. Diese Struktur schließt das plattformspezifische Handle ein, das von den ELT-Assemblyhilfen generiert wird. Der Profiler kann den eltInfo-Zeiger in den Methoden ICorProfilerInfo3::GetFunctionEnter3Info, ICorProfilerInfo3::GetFunctionLeave3Info und ICorProfilerInfo3::GetFunctionTailcall3Info verwenden.

ELT3-Registrierungsmethoden

Sie können langsame und schnelle ELT-Funktionen mithilfe der folgenden zwei ELT3-Registrierungsmethoden festlegen:

Eine dieser Methoden muss angerufen werden, wenn die Anwendung gestartet wird, und zwar vom ICorProfilerCallback::Initialize-Rückruf oder ICorProfilerCallback3::InitializeForAttach-Rückruf des Profilers. Der Profiler muss das gewünschte Ereignisflag bei SetEventMask registrieren, bevor es entweder die SetEnterLeaveFunctionHooks3-Methode aufruft, um schnelles ELT3 zu aktivieren bzw. die SetEnterLeaveFunctionHooks3WithInfo-Methode aufruft, um langsames ELT3 zu aktivieren.

Schnelle ELT3-Hooks können nicht mit langsamen ELT3-Hooks kombiniert werden, und ELT3-Hooks können nicht mit ELT1-oder ELT2-Hooks verwendet werden. Wenn der Profiler keine entsprechenden Ereignisflags angegeben hat, die vor dem Aufrufen in SetEnterLeaveFunctionHooks3 oder SetEnterLeaveFunctionHooks3WithInfo einen langsamen Pfad erfordern (COR_PRF_ENABLE_FUNCTION_ARGS, COR_PRF_ENABLE_FUNCTION_RETVAL, oder COR_PRF_ENABLE_FRAME_INFO), wird der Fehlercode für CORPROF_E_INCONSISTENT_WITH_FLAGS zurückgegeben, um den Fehler anzugeben.

ELT3-Überprüfungsmethoden

ELT3-Benachrichtigungsfunktionen bieten keine Argument- oder Rückgabewertinformationen. Daher muss der Profiler die gewünschten Informationen explizit anfordern, indem er eine der folgenden ICorProfilerInfo3 Überprüfungsmethoden aufruft:

Diese Methoden müssen von der Implementierung des Profilers der entsprechenden langsamen ELT3-Funktion (FunctionEnter3WithInfo, FunctionLeave3WithInfo und FunctionTailcall3WithInfo) aufgerufen werden, und der Profiler muss den gleichen eltInfo-Wert bereitstellen, den er von der ELT-Benachrichtigungsfunktion empfangen hat. Beachten Sie, dass die ELT3-Überprüfungsmethoden möglicherweise nicht von der Implementierung des Profilers einer schnellen ELT3-Benachrichtigungsfunktion (FunctionEnter3, FunctionLeave3, FunctionTailcall3) oder von einer beliebigen ELT1- oder ELT2-Benachrichtigungsfunktion aufgerufen werden.

Siehe auch

Konzepte

Übersicht über die Profilerstellung

Weitere Ressourcen

Profilerstellung (Referenz zur nicht verwalteten API)

Referenz zur nicht verwalteten API