Partager via


Optimisations guidées par profil

L’optimisation guidée par profil (PGO) vous permet d’optimiser un fichier exécutable entier, où l’optimiseur utilise des données à partir des exécutions de test du fichier .exe ou .dll. Les données représentent les performances probables du programme dans un environnement de production.

Les optimisations guidées par profil sont disponibles uniquement pour les cibles natives x86, x64 ou ARM64. Les optimisations guidées par profil ne sont pas disponibles pour les fichiers exécutables qui s’exécutent sur le Common Language Runtime. Même si vous produisez un assembly avec du code natif et managé mixte (à l’aide de l’option du compilateur /clr ), vous ne pouvez pas utiliser l’optimisation guidée par profil sur le code natif uniquement. Si vous tentez de générer un projet avec ces options définies dans l’IDE, une erreur de génération se produit.

Remarque

Les informations collectées à partir des exécutions de test de profilage remplacent les optimisations qui seraient en vigueur si vous spécifiez /Ob, /Os ou /Ot. Pour plus d’informations, consultez /Ob (extension de fonction inline) et /Os, /Ot (Favoriser le petit code, Favoriser le code rapide).

Étapes d’optimisation de votre application

Pour utiliser l’optimisation guidée par profil, procédez comme suit pour optimiser votre application :

  • Compilez un ou plusieurs fichiers de code source avec /GL.

    Chaque module créé avec /GL peut être examiné pendant les exécutions de test d’optimisation guidées par profil pour capturer le comportement d’exécution. Chaque module d’une build d’optimisation guidée par profil n’a pas besoin d’être compilé avec /GL. Toutefois, seuls les modules compilés avec /GL sont instrumentés et plus tard disponibles pour les optimisations guidées par profil.

  • Lien utilisant /LTCG et /GENPROFILE ou /FASTGENPROFILE.

    L’utilisation de /LTCG et /GENPROFILE ou /FASTGENPROFILE crée un .pgd fichier lorsque l’application instrumentée est exécutée. Une fois les données de test exécutées ajoutées au .pgd fichier, elles peuvent être utilisées comme entrée à l’étape de lien suivante (création de l’image optimisée). Lorsque vous spécifiez /GENPROFILE, vous pouvez éventuellement ajouter un argument PGD=filename pour spécifier un nom ou un emplacement nondefault pour le .pgd fichier. La combinaison des options de l’éditeur de liens /LTCG et /GENPROFILE ou /FASTGENPROFILE remplace l’option de l’éditeur de liens /LTCG :PGINSTRUMENT déconseillée.

  • Profilez l'application.

    Chaque fois qu’une session EXE profilée se termine ou qu’une DLL profilée est déchargée, un appname!N.pgc fichier est créé. Un .pgc fichier contient des informations sur une exécution de test d’application particulière. appname est le nom de votre application, et N est un nombre commençant par 1 incrémenté en fonction du nombre d’autres appname!N.pgc fichiers du répertoire. Vous pouvez supprimer un .pgc fichier si l’exécution de test ne représente pas un scénario que vous souhaitez optimiser.

    Pendant une exécution de test, vous pouvez forcer la fermeture du fichier actuellement ouvert .pgc et la création d’un nouveau .pgc fichier 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).

    Votre application peut également appeler directement une fonction PGO, PgoAutoSweep, pour capturer les données de profil au point de l’appel en tant que .pgc fichier. Il peut vous donner un meilleur contrôle sur le code couvert par les données capturées dans vos .pgc fichiers. Pour obtenir un exemple d’utilisation de cette fonction, consultez la documentation PgoAutoSweep .

    Lorsque vous créez votre build instrumentée, par défaut, la collecte de données est effectuée en mode non thread-safe, ce qui est plus rapide, mais peut être imprécise. En utilisant l’argument EXACT sur /GENPROFILE ou /FASTGENPROFILE, vous pouvez spécifier la collecte de données en mode thread-safe, qui est plus précise, mais plus lente. Cette option est également disponible si vous définissez la variable d’environnement PogoSafeMode déconseillée ou l’option /POGOSAFEMODE linker déconseillée lorsque vous créez votre build instrumentée.

  • Lien utilisant /LTCG et /USEPROFILE.

    Utilisez les options de l’éditeur de liens /LTCG et /USEPROFILE pour créer l’image optimisée. Cette étape prend comme entrée le .pgd fichier. Lorsque vous spécifiez /USEPROFILE, vous pouvez éventuellement ajouter un argument PGD=filename pour spécifier un nom ou un emplacement non par défaut pour le .pgd fichier. Vous pouvez également spécifier ce nom à l’aide de l’option /PGD linker déconseillée. La combinaison de /LTCG et /USEPROFILE remplace les options de l’éditeur de liens /LTCG :PGOPTIMIZE et /LTCG :PGUPDATE .

Il est même possible de créer le fichier exécutable optimisé et de déterminer ultérieurement que le profilage supplémentaire serait utile pour créer une image plus optimisée. Si l’image instrumentée et son .pgd fichier sont disponibles, vous pouvez effectuer des exécutions de test supplémentaires et reconstruire l’image optimisée avec le fichier plus récent .pgd , en utilisant les mêmes options de l’éditeur de liens /LTCG et /USEPROFILE .

Remarque

Les deux .pgc et .pgd les fichiers sont des types de fichiers binaires. Si elle est stockée dans un système de contrôle de code source, évitez toute transformation automatique qui peut être effectuée en fichiers texte.

Optimisations effectuées par PGO

Les optimisations guidées par profil incluent ces vérifications et améliorations :

  • Inlining - Par exemple, si une fonction A appelle fréquemment la fonction B et la fonction B est relativement petite, les optimisations guidées par profil inline B dans la fonction A.

  • Spéculation des appels virtuels - Si un appel virtuel ou un autre appel via un pointeur de fonction, cible fréquemment une fonction donnée, une optimisation guidée par profil peut insérer un appel direct exécuté de manière conditionnelle à la fonction fréquemment ciblée, et l’appel direct peut être inline.

  • Allocation d’inscription : l’optimisation basée sur les données de profil entraîne une meilleure allocation d’inscription.

  • Optimisation de bloc de base : l’optimisation de bloc de base permet d’exécuter généralement des blocs de base qui s’exécutent temporellement dans un cadre donné à placer dans le même ensemble de pages (localité). Il réduit le nombre de pages utilisées, ce qui réduit la surcharge de mémoire.

  • Optimisation de la taille/vitesse - Fonctions où le programme passe le plus de temps d’exécution peut être optimisé pour la vitesse.

  • Disposition des fonctions : en fonction du graphique d’appels et du comportement d’appelant/appelé profilé, les fonctions qui ont tendance à se trouver le long du même chemin d’exécution sont placées dans la même section.

  • Optimisation de la branche conditionnelle - Avec les sondes de valeur, les optimisations guidées par profil peuvent trouver si une valeur donnée dans une instruction switch est utilisée plus souvent que d’autres valeurs. Cette valeur peut ensuite être tirée de l’instruction switch. La même chose peut être effectuée avec if...else instructions où l’optimiseur peut commander le if...else afin que le ou else le if bloc soit placé en premier, en fonction de quel bloc est plus fréquemment vrai.

  • 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 de l’ensemble de sections. Il conserve efficacement cette section hors des pages souvent utilisées.

  • Séparation du code EH : étant donné que le code EH n’est exécuté qu’exceptionnellement, il peut souvent être déplacé vers une section distincte. Il est déplacé lorsque les optimisations guidées par profil peuvent déterminer que les exceptions se produisent uniquement dans des conditions exceptionnelles.

  • Intrinsèques à la mémoire : l’extension d’une intrinsèque ou non dépend de l’appel fréquent. Un élément intrinsèque peut également être optimisé en fonction de la taille de bloc des déplacements ou des copies.

Étapes suivantes

En savoir plus sur ces variables d’environnement, fonctions et outils que vous pouvez utiliser dans les optimisations guidées par profil :

Variables d’environnement pour les optimisations guidées par profil
Ces variables ont été utilisées pour spécifier le comportement d’exécution des scénarios de test. Ils sont désormais déconseillés et remplacés par de nouvelles options d’éditeur de liens. Ce document vous montre comment passer des variables d’environnement aux options de l’éditeur de liens.

PgoAutoSweep
Une fonction que vous pouvez ajouter à votre application pour fournir un contrôle de capture de données de fichier affiné .pgc .

pgosweep
Utilitaire de ligne de commande qui écrit toutes les données de profil dans le .pgc fichier, ferme le .pgc fichier et ouvre un nouveau .pgc fichier.

pgomgr
Utilitaire de ligne de commande qui ajoute des données de profil d’un ou de plusieurs .pgc fichiers au .pgd fichier.

Procédure : fusionner plusieurs profils PGO en un seul profil
Exemples d’utilisation de pgomgr .

Voir aussi

Outils de build MSVC supplémentaires