Optimisations guidées par profil
L'optimisation guidée par profil permet d'optimiser un fichier de sortie, où l'optimiseur utilise les données de séries de tests du fichier .exe ou .dll. Les données représentent la manière dont le programme s'exécutera probablement dans un environnement de production.
Les optimisations guidées par profil sont uniquement disponibles pour x86 ou les cibles x64 d'origine. Les optimisations guidées par profil ne sont pas disponibles pour les fichiers de sortie qui doivent s'exécuter sur le Common Language Runtime. Même si vous produisez un assembly avec du code mixte natif et managé (compilation avec /clr), vous ne pouvez pas utiliser l'optimisation guidée par profil sur le code natif uniquement. Si vous essayez de générer un projet avec ces options dans l'IDE, une erreur de build se produit.
Notes
Les informations collectées à partir des séries de tests de profilage substituent les optimisations qui s'appliqueraient si vous spécifiez /Ob, /Os ou /Ot.Pour plus d’informations, consultez /Ob (Expansion des fonctions Inline) et /Os, /Ot (Favoriser la taille du code, Favoriser la vitesse du code).
Vous trouverez ci-dessous un aperçu du processus d'utilisation d'optimisations guidées par profil :
Compilez un ou plusieurs fichiers de code source avec /GL.
Chaque module généré avec /GL peut être examiné pendant les séries de tests de l'optimisation guidée par profil pour capturer le comportement au moment de l'exécution. Il n'est pas nécessaire que chaque module dans une génération d'optimisation guidée par profil soit compilé avec /GL. Toutefois, seuls les modules compilés avec /GL seront instrumentés et disponible ultérieurement pour les optimisations guidées par profil.
Effectuez la liaison avec /LTCG:PGINSTRUMENT.
/LTCG:PGINSTRUMENT crée un fichier .pgd vide. Une fois les données de l'exécution de test ajoutées au fichier .pgd, elles peuvent être utilisées en entrée pour la prochaine étape de liaison (création de l'image optimisée). Lors de la spécification de /LTCG:PGINSTRUMENT, vous pouvez éventuellement spécifier /PGD avec un nom et un emplacement autres que ceux par défaut pour le fichier .pgd.
Profilez l'application.
Chaque fois qu'une session EXE profilée se termine ou qu'une DLL profilée est déchargée, un fichier NomApplication!#.pgc est créé. Un fichier .pgc contient des informations relatives à une série de tests d'applications particulière. # est un nombre commençant par 1 qui est incrémenté selon le nombre d'autres fichiers NomApplication!#.pgc contenus dans le répertoire. Vous pouvez supprimer un fichier .pgc si la série de tests ne représente pas un scénario que vous souhaitez optimiser.
Au cours d'une série de tests, vous pouvez forcer la fermeture du fichier .pgc actuellement ouvert et la création d'un nouveau fichier .pgc avec l'utilitaire pgosweep (par exemple, lorsque la fin d'un scénario de test ne coïncide pas avec l'arrêt de l'application).
Vous pouvez utiliser l'option PogoSafeMode lorsque vous profilez votre application. Cette option vous permet de spécifier si vous souhaitez profiler l'application en mode sans échec ou mode rapide. Pour plus d'informations sur ces modes, consultez PogoSafeMode.
Effectuez la liaison avec /LTCG:PGOPTIMIZE.
/LTCG:PGOPTIMIZE crée l'image optimisée. Cette étape prend comme entrée le fichier .pgd. Pour plus d'informations, consultez /LTCG:PGOPTIMIZE.
Il est même possible de créer le fichier de sortie optimisé et de déterminer ultérieurement qu'un profilage supplémentaire serait utile pour créer une image plus optimisée. Si l'image instrumentée et son fichier .pgd sont disponibles, vous pouvez effectuer des séries de tests supplémentaires et régénérer l'image optimisée avec le fichier .pgd le plus récent.
Vous trouverez ci-dessous une liste des optimisations guidées par profil :
Fonctionnalité inline : par exemple, s'il existe une fonction A qui appelle fréquemment la fonction B et que la fonction B est relativement petite, les optimisations guidées par profil utiliseront la fonction inline sur la fonction B dans la fonction A.
Spéculation sur les appels virtuels : si un appel virtuel ou un autre appel par l'intermédiaire d'un pointeur fonction cible fréquemment une certaine fonction, une optimisation guidée par profil peut insérer un appel direct exécuté conditionnellement à la fonction fréquemment ciblée, et l'appel direct peut être inline.
Allocation des registres : l'optimisation avec les données de profil entraîne une meilleure allocation des registres.
Optimisation des blocs de base : l'optimisation des blocs de base permet de placer les blocs de base fréquemment utilisés qui s'exécutent temporellement dans un frame donné au sein du même jeu de pages (localité). Cela réduit le nombre de pages utilisé, entraînant ainsi une réduction de la charge mémoire.
Optimisation de la taille/vitesse : les fonctions auxquelles le programme consacre beaucoup de temps peuvent être optimisées pour s'exécuter plus rapidement.
Disposition des fonctions : selon le graphique des appels et le comportement des appelants/appelés profilé, les fonctions qui ont tendance à se situer le long du même chemin d'exécution sont placées dans la même section.
Optimisation des branches conditionnelles : en prélevant les valeurs, les optimisations guidées par profil peuvent déterminer si une valeur donnée dans une instruction switch est utilisée plus souvent que d'autres valeurs. Cette valeur peut ensuite être extraite de l'instruction switch. La même opération peut être effectuée avec des instructions if/else dans lesquelles l'optimiseur peut organiser les instructions if/else afin que le bloc if ou else soit placé en premier selon le bloc qui est le plus souvent true.
Séparation du code mort : le code qui n'est pas appelé pendant le profilage est déplacé vers une section spéciale ajoutée à la fin du jeu de sections. Cela permet de laisser efficacement cette section en dehors des pages utilisées fréquemment.
Séparation du code EH : le code EH, qui ne s'exécute qu'exceptionnellement, peut souvent être déplacé vers une section distincte lorsque les optimisations guidées par profil peuvent déterminer que les exceptions ne se produisent que dans des conditions exceptionnelles.
Intrinsèques mémoire : l'expansion d'éléments intrinsèques peut être conseillée s'il peut être déterminé qu'un élément intrinsèque est fréquemment appelé. Un élément intrinsèque peut également être optimisé selon la taille de bloc des déplacements ou copies.
Pour plus d'informations, consultez Walkthrough: Using Profile-Guided Optimizations.
Dans cette section
Outils de l'optimisation guidée par profil
Comment : fusionner plusieurs profils PGO en un seul profil