Partager via


Profilage à l'aide de l'API ELT

Les profileurs de traçage consignent les entrées et sorties de fonctions, et peuvent également gérer des graphiques d'appels historiques. Pour faciliter l'implémentation de cette fonctionnalité, le .NET Framework fournit les fonctions statiques globales de profilages, qui contiennent des jeux d'interfaces et de fonctions liées appelées API ELT (enter/leave/tailcall).

Avant le .NET Framework version 4, les profileurs de traçage qui utilisaient les fonctions ELT subissaient une baisse des performance parallèle à l'augmentation du nombre de petites fonctions managées. À partir du .NET Framework 4, vous pouvez utiliser l'API ELT version 3 (ELT3) pour améliorer les performances ELT, en particulier lorsqu'il n'est pas nécessaire d'inspecter les arguments ou les valeurs de retour. Les améliorations des performances sont les suivantes :

  • La taille du code compilé juste-à-temps diminue pour les fonctions de chemin d'accès rapide ELT.

  • Le nombre d'arguments ELT requis est réduit au minimum, ce qui diminue l'espace nécessaire au sein de pile pour les paramètres passés au profileur.

  • L'installation du frame de pile et l'inspection des arguments se produisent uniquement en cas de besoin, ce qui augmente la vitesse d'exécution.

  • Les informations de frame et d'arguments sont initialisées de façon tardive lorsqu'une nouvelle méthode ICorProfilerInfo3 est appelée.

Les interfaces ELT3 sont compatibles avec les interfaces ELT (ELT1 et ELT2) dans les versions antérieures du .NET Framework.

Le .NET Framework 4 implémente des fonctions ELT2 au-dessus de ELT3 et utilise une table de hachage supplémentaire pour effectuer des mappages entre ID de client et ID de fonction. Cela génère un coût de synchronisation élevé et un profilage lent lors de l'utilisation des fonctions ELT2. La dégradation des performance est encore pire sur les ordinateurs multiprocesseurs très chargés. Toutefois, les modifications de code requises pour effectuer la migration d'un profileur vers les API ELT3 sont simples et peu coûteuses. Nous vous recommandons donc d'adopter ELT3 afin de bénéficier de meilleures performances.

Fonctions et méthodes ELT3

L'API ELT3 fournit trois types de membres :

  • Fonctions de notification, appelées par le CLR pour indiquer à un profileur que le contrôle est passé à une fonction dans l'application cible.

  • Méthodes d'inscription, appelées par le profileur pour activer des méthodes d'inspection de chemin d'accès rapide ou chemin d'accès lent.

  • Méthodes d'inspection, appelées par le profileur pour extraire des informations d'argument ou de valeur de retour.

Fonctions de notification ELT3

À compter du .NET Framework 4, vous pouvez utiliser trois (sur six) fonctions de notification ELT3 pour indiquer au profileur que le contrôle est passé à une fonction dans l'application cible (application en cours de profilage). Les fonctions de notification ELT3 se composent de fonctions de chemin d'accès rapide et fonctions de chemin d'accès lent :

  • Les fonctions de chemin d'accès rapide sont caractérisées par du code compilé juste-à-temps qui appelle directement les méthodes ELT du profileur sans code intermédiaire.

  • Les fonctions de chemin d'accès lent sont caractérisées par du code compilé juste-à-temps qui appelle un intermédiaire (habituellement une combinaison de code d'assembly et de code C compilée dans la DLL du CLR) avant d'appeler les méthodes ELT du profileur.

Les trois fonctions suivantes sont des fonctions de chemin d'accès rapide et requièrent un seul paramètre, l'identificateur de la fonction à laquelle le contrôle est passé ou retourné, ou qui est sur le point d'effectuer un appel tail :

Les trois fonctions suivantes sont des fonctions de chemin d'accès lent et requièrent deux paramètres, l'identificateur de fonction et un handle vers les informations relatives à un frame de pile :

Dans ces trois fonctions, le deuxième paramètre (eltInfo) que le runtime passe au profileur est un pointeur opaque vers une structure _COR_PRF_ELT_INFO_INTERNAL allouée sur la pile. Cette structure contient le handle spécifique à la plateforme généré par les programmes d'assistance d'assembly ELT. Le profileur peut utiliser le pointeur eltInfo dans les méthodes ICorProfilerInfo3::GetFunctionEnter3Info, ICorProfilerInfo3::GetFunctionLeave3Info et ICorProfilerInfo3::GetFunctionTailcall3Info.

Méthodes d'inscription ELT3

Vous pouvez utiliser les deux méthodes d'inscription ELT3 suivantes pour définir des fonctions ELT de chemin d'accès lent et de chemin d'accès rapide :

L'une de ces méthodes doit être appelée lorsque l'application démarre, à partir du rappel ICorProfilerCallback::Initialize ou ICorProfilerCallback3::InitializeForAttach du profileur. Le profileur doit inscrire l'indicateur d'événement désiré avec SetEventMask avant d'appeler la méthode SetEnterLeaveFunctionHooks3 pour activer une fonction ELT3 de chemin d'accès rapide ou la méthode SetEnterLeaveFunctionHooks3WithInfo pour activer une fonction ELT3 de chemin d'accès lent.

Les raccordements ELT3 de chemin d'accès rapide ne peuvent pas être mélangés avec les raccordements ELT3 de chemin d'accès lent, et les raccordements ELT3 ne peuvent pas être utilisés avec les raccordements ELT1 ou ELT2. Si le profileur n'a pas spécifié les indicateurs d'événement appropriés qui requièrent un chemin d'accès lent (COR_PRF_ENABLE_FUNCTION_ARGS, COR_PRF_ENABLE_FUNCTION_RETVAL ou COR_PRF_ENABLE_FRAME_INFO) avant d'appeler SetEnterLeaveFunctionHooks3 ou SetEnterLeaveFunctionHooks3WithInfo, le code d'erreur CORPROF_E_INCONSISTENT_WITH_FLAGS est retourné pour indiquer l'échec.

Méthodes d'inspection ELT3

Les fonctions de notification ELT3 ne fournissent pas d'informations d'argument ou de valeur de retour. Par conséquent, le profileur doit demander explicitement les informations qu'il souhaite en appelant l'une des méthodes d'inspection ICorProfilerInfo3 suivantes :

Ces méthodes doivent être appelées à partir de l'implémentation du profileur de la fonction ELT3 de chemin d'accès lent correspondante (FunctionEnter3WithInfo, FunctionLeave3WithInfo et FunctionTailcall3WithInfo), et le profileur doit fournir la valeur eltInfo qu'il a reçue depuis la fonction de notification ELT. Notez que les méthodes d'inspection ELT3 ne peuvent pas être appelées à partir de l'implémentation du profileur d'une fonction de notification de chemin d'accès rapide ELT3 (FunctionEnter3, FunctionLeave3, FunctionTailcall3), ou à partir de toute fonction de notification ELT1 ou ELT2.

Voir aussi

Concepts

Vue d'ensemble du profilage

Autres ressources

Profilage (Référence des API non managées)

Référence des API non managées