Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’optimisation guidée par profil (PGO) vous permet d’optimiser un fichier exécutable entier. L’optimiseur utilise les données 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.
Remarque
Le SPGO (optimisation guidée par profil d’échantillonnage) est une autre approche qui utilise les compteurs de performances Windows du processeur au lieu de l’instrumentation. SPGO ne nécessite aucune version instrumentée : vous établissez le profil d’un binaire de production existant à l’aide de xperf. Pour plus d’informations, consultez le tutoriel sur l’optimisation guidée par profil (SPGO).
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.
Le compilateur examine chaque module créé avec /GL pendant les exécutions de test d’optimisation guidée par profil pour capturer le comportement d’exécution. Vous n’avez pas besoin de compiler chaque module dans une build d’optimisation guidée par profil 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 à l’aide de /LTCG et /GENPROFILE ou /FASTGENPROFILE.
Lorsque vous utilisez à la fois /LTCG et /GENPROFILE ou /FASTGENPROFILE, l’application instrumentée crée un
.pgdfichier lorsqu’elle s’exécute. Une fois que les données de test d’exécution sont ajoutées au.pgdfichier, vous pouvez l’utiliser 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.pgdfichier. 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 se décharge, le processus crée un
appname!N.pgcfichier. Un.pgcfichier 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. Il incrémente en fonction du nombre d’autresappname!N.pgcfichiers dans le répertoire. Vous pouvez supprimer un.pgcfichier 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
.pgcet la création d’un nouveau.pgcfichier à l’aide de 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 sous forme de fichier
.pgc. Il peut vous donner un meilleur contrôle sur le code couvert par les données capturées dans vos.pgcfichiers. Pour obtenir un exemple d’utilisation de cette fonction, consultez la documentation PgoAutoSweep .Lorsque vous créez votre version instrumentée, par défaut, la collecte de données est effectuée en mode non sécurisé pour les threads, ce qui est plus rapide, mais peut être imprécis. 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 à l’aide de /LTCG et /USEPROFILE.
Utilisez les options de l’éditeur de liens /LTCG et /USEPROFILE pour créer l’image optimisée. Cette étape utilise le fichier
.pgdcomme entrée. Lorsque vous spécifiez /USEPROFILE, vous pouvez éventuellement ajouter un argument PGD=filename pour spécifier un nom ou un emplacement nondefault pour le.pgdfichier. Vous pouvez également spécifier ce nom à l’aide de l’option de linker /PGD déconseillée. La combinaison des options de l’éditeur de liens /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 qu’un plus grand nombre de profilages serait utile pour créer une image plus optimisée. Si l’image instrumentée et son .pgd fichier sont disponibles, vous pouvez effectuer davantage de tests et reconstruire l’image optimisée avec le fichier plus récent .pgd à l’aide des mêmes options /LTCG et /USEPROFILE linker.
Remarque
.pgc et .pgd sont tous les deux des types de fichiers binaires. Si vous les stockez 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 :
Insertion en ligne - Par exemple, si la fonction A appelle fréquemment la fonction B et que la fonction B est relativement petite, les optimisations guidées par profil insèrent la fonction B dans la fonction A.
Spéculation d'appel virtuel - Si des appels virtuels, ou d'autres appels via un pointeur de fonction, ciblent fréquemment une fonction donnée, une optimisation guidée par profil peut insérer des appels directs exécutés conditionnellement vers 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 des blocs de base : l’optimisation des blocs de base permet d’exécuter généralement des blocs de base exécutés 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 optimisation peut être effectuée avec des instructions
if...else, où l’optimiseur peut ordonner leif...elsede sorte que le blocifouelsesoit placé en premier, selon celui qui est le plus souvent vrai.Séparation du code mort : l’optimisation guidée par profil déplace le code qui n’est pas appelé pendant le profilage vers une section spéciale à 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. Les optimisations guidées par profil le déplacent lorsqu’elles déterminent que les exceptions se produisent uniquement dans des conditions exceptionnelles.
Intrinsèques mémoire - Le fait de développer ou non une fonction intrinsèque dépend de la fréquence à laquelle elle est appelée. Un élément intrinsèque peut également être optimisé en fonction de la taille des blocs des opérations de déplacement ou de copie.
Étapes suivantes
Pour en savoir plus sur ces variables d’environnement, fonctions et outils que vous pouvez utiliser dans les optimisations guidées par profil, consultez les ressources suivantes :
Variables d’environnement pour les optimisations guidées par profil
Ces variables spécifient 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 offrir un contrôle granulaire de la capture de données de fichier .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 .
Tutoriel d’exemple sur l’optimisation guidée par profil (SPGO)
Utilisez des compteurs de performances matériels processeur au lieu de l’instrumentation. Aucune build instrumentée requise : profilez votre fichier binaire de mise en production existant avec xperf.