Analyser les performances à l’aide du profilage du processeur dans le Profileur de performances (C#, Visual Basic, C++, F#)
Une bonne façon de commencer à analyser les problèmes de performances dans votre application est de comprendre son utilisation du processeur à l’aide d’un outil de profilage CPU. L’outil de performances utilisation du processeur de Visual Studio montre le temps de calcul actif du processeur et le pourcentage passé à exécuter du code en C++, C#/Visual Basic.
L’outil Utilisation du processeur peut vous aider à :
Diagnostiquer un ralentissement ou un blocage de processus dans la base de code de votre équipe. L’outil peut vous aider à diagnostiquer le problème avec le code de production de votre équipe. Il fournit des insights automatiques et différentes vues de vos données afin de pouvoir analyser et diagnostiquer les problèmes de performances.
Identifier les problèmes de performances dans les scénarios DevOps Par exemple, l’outil peut aider lorsqu’un client signale que certaines demandes ou commandes ne passent pas au site web de vente au détail pendant la saison de pointe. Souvent, les problèmes sont en production et il est difficile de déboguer à ce moment-là, mais cet outil peut vous aider à capturer suffisamment d’informations et de preuves du problème. Après avoir collecté un fichier de trace, l’analyse peut rapidement vous aider à comprendre les causes potentielles et à donner des suggestions dans le contexte de votre code afin que vous puissiez effectuer les étapes suivantes pour résoudre le problème.
Rechercher une utilisation élevée du processeur Si votre problème de latence n’est pas dans une requête d’API, vous pouvez rechercher une utilisation élevée du processeur et d’autres problèmes connexes avec l’outil Utilisation du processeur. L’outil Utilisation du processeur peut vous aider à identifier les goulots d’étranglement afin que vous puissiez affiner l’emplacement d’optimisation.
L’outil Utilisation de l’UC est utile à la fois pour les sessions de suivi locales et la production. Vous pouvez exécuter l’outil Utilisation du processeur en utilisant le raccourci clavier, Alt+F2, puis en choisissant l’utilisation du processeur, ou en ouvrant une trace déjà collectée à l’aide d’un outil tel que dotnet-trace ou dotnet-monitor. (Pour le code de production .NET, il s’agit probablement de la façon dont vous collecteriez des traces.)
Vous pouvez exécuter l’outil Utilisation du processeur sur un projet Visual Studio ouvert, sur une application Microsoft Store installée ou attaché à une application ou un processus en cours d’exécution. Vous pouvez exécuter l’outil Utilisation du processeur sur les builds de mise en production ou de débogage. Pour plus d’informations, consultez Exécuter des outils de profilage sur les builds de mise en production ou de débogage.
Les instructions suivantes montrent comment utiliser l’outil Utilisation du processeur sans le débogueur, à l’aide de Visual Studio Performance Profiler. Les exemples utilisent une build Release sur un ordinateur local. Les builds de mise en production fournissent la meilleure vue des performances réelles de l’application. Pour obtenir un didacticiel qui montre comment améliorer les performances à l’aide de l’outil Utilisation du processeur, consultez Étude de cas : Guide du débutant pour optimiser le code.
En règle générale, l’ordinateur local réplique le mieux l’exécution de l’application installée. Pour collecter des données à partir d’un appareil distant, exécutez l’application directement sur l’appareil, et non via une connexion Bureau à distance.
Collecter les données d’utilisation du processeur
Dans le projet Visual Studio, définissez la configuration de la solution sur Release et sélectionnez Débogueur Windows local (ou Machine locale) comme cible de déploiement.
Sélectionnez Déboguer>Profileur de performances.
Sous Outils disponibles, sélectionnez Utilisation de l’UC, puis Démarrer.
Si vous activez l’option Démarrer avec la collecte suspendue avant de démarrer le profileur, les données ne seront collectées que lorsque vous sélectionnez le bouton Enregistrer dans l’affichage de session de diagnostic.
Note
Pour plus d’informations sur la façon de rendre l’outil plus efficace, consultez Optimisation des paramètres profileur.
Une fois l’application démarrée, la session de diagnostic commence et affiche les données d’utilisation du processeur. Lorsque vous avez terminé de collecter des données, sélectionnez Arrêter la collecte.
L’outil Utilisation du processeur analyse les données et affiche le rapport. Si vous rencontrez des problèmes lors de la collecte ou de l’affichage de données, consultez Résoudre les erreurs de profilage et résoudre les problèmes.
Utilisez la liste déroulante Filtre pour sélectionner ou désélectionner des threads à afficher, puis utilisez la zone Rechercher pour rechercher un thread ou un nœud spécifique.
Colonnes de données d’utilisation du processeur
Nom | Description |
---|---|
total du processeur [unité, %] | ![]() Les millisecondes de temps de calcul d’UC et le pourcentage d’UC utilisé par les appels à la fonction, et les fonctions appelées par la fonction, dans l’intervalle de temps sélectionné. Ceci est différent du graphique chronologique d'utilisation du processeur, qui compare l'activité totale du processeur dans un intervalle de temps à la capacité totale disponible du processeur. |
Temps UC exclusif [unité, %] | ![]() Le temps de calcul du processeur en millisecondes et le pourcentage de CPU utilisé par les appels à la fonction dans l’intervalle de temps sélectionné, qui exclut les fonctions appelées par la fonction. |
Module | Dans certaines vues, la colonne Module s’affiche, qui affiche le nom du module contenant la fonction. |
Analyser les aperçus sur le processeur
Si des insights s’affichent dans la section Top Insights, utilisez le lien fourni pour obtenir plus d’informations sur le problème identifié. En outre, si vous utilisez Copilot, le bouton Demander à Copilot ouvre la fenêtre de conversation Copilot, et Copilot fournit des suggestions en fonction de votre code et des problèmes identifiés.
Pour plus d’informations, consultez Insights de l’UC.
Analyser l’utilisation du processeur
Pour analyser le rapport utilisation du processeur, cliquez sur Ouvrir les détails, ou cliquez sur l’une des fonctions principales pour ouvrir la vue Functions.
Le rapport fournit différentes vues des données de diagnostic :
- Appelant/appelé
- Arborescence des appels
- Modules
- Fonctions
- Graphique de flamme
Pour analyser le rapport, cliquez sur Créer un rapport détaillé.
Le rapport fournit différentes vues des données de diagnostic :
- Appelant/appelé
- Arborescence des appels
Dans toutes les vues, à l’exception de Appelant/appelé, le rapport de diagnostic est trié par UC total, du plus élevé au plus bas. Modifiez l’ordre de tri ou la colonne de tri en sélectionnant les en-têtes de colonne. Vous pouvez double-cliquer sur une fonction qui vous intéresse, et vous verrez la source de la fonction ainsi que la mise en surbrillance qui indique où le temps est passé dans cette fonction. Le tableau affiche des colonnes avec des données telles que le temps passé dans la fonction, notamment les fonctions appelées (processeur total) et une deuxième colonne qui indique le temps passé dans une fonction, à l’exclusion des fonctions appelées (processeur automatique).
Ces données peuvent vous aider à évaluer si la fonction elle-même est un goulot d’étranglement des performances. Déterminez la quantité de données affichées par la méthode pour voir si le code ou les bibliothèques d'exécution tiers sont responsables de la lenteur de vos points de terminaison ou de leur forte consommation de ressources.
Pour plus d’informations sur l’utilisation du Flame Graph, consultez Identifier les chemins critiques avec le Flame Graph.
Arborescence des appels d’utilisation du processeur
Pour afficher l’arborescence des appels, sélectionnez le nœud parent dans le rapport. Par défaut, la page Utilisation de l’UC s’ouvre sur la vue Appelant/appelé. Dans la liste déroulante Vue actuelle, sélectionnez Arborescence des appels.
Vous pouvez cliquer sur les boutons Développer le chemin d’accès chaud et Afficher le chemin d’accès chaud pour afficher les appels de fonction qui utilisent le pourcentage le plus élevé de l’UC dans l’arborescence des appels.
Arborescence des appels
Image | Description |
---|---|
![]() |
Nœud de niveau supérieur dans l’arborescence des appels d’utilisation du processeur, représentant l’application. |
![]() |
Dans la plupart des applications, lorsque l’option Afficher le code externe est désactivée, le nœud de deuxième niveau est un nœud [Code externe] nœud. Le nœud contient le code système et d’infrastructure qui démarre et arrête l’application, dessine l’interface utilisateur, contrôle la planification des threads et fournit d’autres services de bas niveau à l’application. |
![]() |
Les enfants du nœud de deuxième niveau sont les méthodes de code utilisateur et les routines asynchrones appelées ou créées par le système de deuxième niveau et le code d’infrastructure. |
![]() |
Les nœuds enfants d’une méthode ont des données seulement pour les appels de la méthode parente. Lorsque Afficher le code externe est désactivé, les méthodes de l'application peuvent également contenir un nœud [Code externe]. |
Code externe
Les fonctions système et d’infrastructure exécutées par votre code sont appelées code externe. Les fonctions de code externe démarrent et arrêtent l’application, dessinent l’interface utilisateur, contrôlent le threading et fournissent d’autres services de bas niveau à l’application. Dans la plupart des cas, vous n’êtes pas intéressé par le code externe. Par conséquent, l’arborescence des appels d’utilisation du processeur rassemble les fonctions externes d’une méthode utilisateur en un nœud [Appel externe].
Pour afficher les chemins d’appel du code externe, dans la page récapitulative du rapport principal (volet droit), désélectionnez Afficher uniquement mon code de la liste déroulante Paramètres , puis sélectionnez Appliquer. (La liste déroulante des paramètres est disponible uniquement sur la page récapitulative du rapport principal, et non sur les vues détaillées.)
Les fonctions système et d’infrastructure exécutées par votre code sont appelées code externe. Les fonctions de code externe démarrent et arrêtent l’application, dessinent l’interface utilisateur, contrôlent le threading et fournissent d’autres services de bas niveau à l’application. Dans la plupart des cas, vous n’êtes pas intéressé par le code externe, de sorte que l’arborescence des appels d’utilisation du processeur rassemble les fonctions externes d’une méthode utilisateur dans un nœud [Code externe].
Pour voir les chemins d’appel du code externe, sélectionnez Afficher le code externe dans la liste déroulante Filtrer de la page principale des rapports de diagnostic (volet droit), puis sélectionnez Appliquer. La vue Arborescence des appels de la page Utilisation de l’UC étend alors les appels de code externe. (La liste déroulante Filtrer est disponible sur la page principale des diagnostics, et non sur les vues détaillées.)
Lorsque vous désactivez Afficher uniquement mon code, la vue Arborescence des appels de la page Utilisation de l’UC développe les appels de code externe.
De nombreuses chaînes d’appels de code externe sont profondément imbriquées. La largeur de la chaîne peut donc dépasser la largeur d’affichage de la colonne nom de la fonction. Les noms de fonctions apparaissent ensuite comme indiqué dans l’image suivante.
De nombreuses chaînes d’appels de code externe sont profondément imbriquées. La largeur de la chaîne peut donc dépasser la largeur d’affichage de la colonne nom de la fonction. Les noms de fonctions apparaissent ensuite sous forme de ....
Pour rechercher un nom de fonction que vous recherchez, utilisez la zone de recherche. Pointez sur la ligne sélectionnée ou utilisez la barre de défilement horizontale pour afficher les données.
Fonctions asynchrones dans l’arborescence des appels de l’utilisation du processeur
Lorsque le compilateur rencontre une méthode asynchrone, il crée une classe masquée pour contrôler l’exécution de la méthode. Conceptuellement, la classe est une machine à états. La classe possède des fonctions générées par le compilateur qui appellent de façon asynchrone les méthodes d’origine, ainsi que les rappels, le planificateur et les itérateurs nécessaires pour les exécuter. Lorsqu’une méthode parent appelle la méthode d’origine, le compilateur supprime la méthode du contexte d’exécution du parent et exécute les méthodes de classe masquées dans le contexte du code système et de l’infrastructure qui contrôle l’exécution de l’application. Les méthodes asynchrones sont souvent, mais pas toujours, exécutées sur un ou plusieurs threads différents. Ce code est affiché dans l’arborescence des appels Utilisation de l’UC en tant qu’enfants du nœud [Code externe] situé immédiatement sous le nœud supérieur de l’arborescence.
Dans l’exemple suivant, les deux premiers nœuds sous [Code externe] sont les méthodes générées par le compilateur de la classe d’ordinateur d’état. Le troisième nœud est l’appel à la méthode d’origine.
Développez les méthodes générées pour afficher ce qui se passe :
MainPage::GetMaxNumberAsyncButton_Click
gère simplement une liste des valeurs de tâche, calcule le maximum des résultats et affiche la sortie.MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext
affiche l'activité requise pour planifier et lancer les 48 tâches qui enveloppent l'appel àGetNumberAsync
.MainPage::<GetNumberAsync>b__b
affiche l’activité des tâches qui appellentGetNumber
.
Collecter les nombres d’appels (.NET)
Si vous souhaitez afficher le nombre d’appels dans la vue Functions, vous pouvez activer le paramètre avant de démarrer le profileur. Ce paramètre est pris en charge pour les types de projets .NET et nécessite le lancement du processus sous le profileur. Le scénario d’attachement n’est pas pris en charge.
Sélectionnez l'icône Paramètres pour l'utilisation du processeur dans le Profileur de performances.
Activez l’option Collecter les nombres d’appels (.NET uniquement).
Collecter les données d’utilisation du processeur.
Ouvrez la vue Fonctions, puis assurez-vous que la colonne Nombre d'appels est définie comme visible.
Si vous ne voyez pas la colonne, cliquez avec le bouton droit sur un en-tête de colonne pour choisir des colonnes visibles.