Partager via


Optimisations guidées par profil

Mise à jour : novembre 2007

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 les cibles natives : x86, famille de processeurs Itanium (IPF, Itanium Processor Family) ou x64. 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.

Remarque :

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. Chaque module d'une génération à optimisation guidée par profil ne doit pas être compilé avec /GL. Toutefois, seuls les modules compilés avec /GL seront instrumentés et mis ultérieurement à la disposition des 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).

  • Effectuez la liaison avec /LTGC:PGOPTIMIZE.

    /LTGC: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 Procédure pas à pas : utilisation d'optimisations guidées par profil.

Dans cette section

Outils de l'optimisation guidée par profil

Comment : fusionner plusieurs profils PGO en un seul profil

Voir aussi

Référence

Outils de génération C/C++