Analyser l'utilisation de l'UCAnalyze CPU Usage

Lorsque vous devez étudier les problèmes de performances de votre application, un bon point de départ consiste à comprendre son utilisation du processeur.When you need to investigate performance issues in your app, a good place to start is understanding how it uses the CPU. L’outil Utilisation du processeur vous montre où le processeur exécute du code Visual C++, Visual C#/Visual Basic et JavaScript.The CPU Usage tool shows you where the CPU is spending time executing Visual C++, Visual C#/Visual Basic, and JavaScript code. À compter de Visual Studio 2015 Update 1, vous pouvez afficher une répartition par fonction de l’utilisation du processeur sans quitter le débogueur.Starting in Visual Studio 2015 Update 1, you can see a per-function breakdown of CPU usage without leaving the debugger. Vous pouvez activer et désactiver le profilage du processeur pendant le débogage, et afficher les résultats quand l’exécution est arrêtée, par exemple à un point d’arrêt.You can turn CPU profiling on and off while debugging, and view the results when execution is stopped, for example at a breakpoint.

Vous disposez de plusieurs options pour exécuter et gérer votre session de diagnostic.You have several options for running and managing your diagnostics session. Par exemple, vous pouvez exécuter l’outil Utilisation du processeur sur les ordinateurs locaux ou distants, ou bien dans un simulateur ou un émulateur.For example, you can run the CPU Usage tool on local or remote machines, or on in a simulator or emulator. Vous pouvez analyser les performances d’un projet ouvert dans Visual Studio, attaché à une application en cours d’exécution, ou démarrer une application installée à partir du Microsoft Store.You can analyze the performance of an open project in Visual Studio, attached to a running app, or start an app that is installed from the Microsoft Store. Pour plus d’informations, consultez Exécution des outils de profilage avec ou sans débogueur.For more information, see Run Profiling Tools with or without the Debugger.

Nous vous montrons ici comment collecter et analyser l’utilisation de l’UC avec les versions finales.Here, we show you how to collect and analyze CPU usage with release builds. Pour analyser l’utilisation de l’UC pendant le débogage, consultez Guide du débutant en profilage des performances.To analyze CPU usage while debugging, see Beginner's Guide to Performance Profiling.

Note

Pour .NET Core et ASP.NET Core, l’outil Utilisation de l’UC ne fournit pas de résultats précis avec les fichiers PBD portables.For .NET Core and ASP.NET Core, the CPU Usage tool currently does not provide accurate results with portable PBDs. Utilisez des fichiers PDB complets à la place.Use full PDBs instead.

Collecter les données d'utilisation de l'UCCollect CPU usage data

  1. Dans Visual Studio, définissez la configuration de solution sur Version finale et choisissez la cible de déploiement.In Visual Studio, set the solution configuration to Release and choose the deployment target.

    Sélectionner la version et l’ordinateur localSelect Release and Local Machine

    • L'exécution de l'application en mode Version finale vous offre une meilleure vue des performances réelles de votre application.Running the app in Release mode gives you a better view of the actual performance of your app.

    • L'exécution de l'application sur l'ordinateur local réplique au mieux l'exécution de l'application installée.Running the app on the local machine best replicates the execution of the installed app.

    • Si vous collectez les données à partir d'un appareil distant, exécutez l'application directement sur l'appareil et non par une connexion Bureau à distance.If you are collecting data from a remote device, run the app directly on the device and not by using a Remote Desktop Connection.

    • Pour les applications Windows Phone, la collecte des données directement à partir de l' Appareil fournit les données les plus précises.For Windows Phone apps, collecting data directly from the Device provides the most accurate data.

  2. Dans le menu Déboguer , choisissez Profileur de performances.On the Debug menu, choose Performance Profiler....

  3. Choisissez Utilisation de l'UC , puis Démarrer.Choose CPU Usage and then choose Start.

    Cliquer sur Utilisation du processeurChoose CPU Usage

  4. Lorsque l'application démarre, cliquez sur Obtenir le nombre maximal.When the app starts, click Get Max Number. Attendez environ une seconde après que la sortie s'est affichée, puis choisissez Obtenir le nombre maximal asynchrone.Wait about a second after the output is displayed, then choose Get Max Number Async. L'attente entre les clics de bouton permet plus facilement d'isoler les routines de clic de bouton dans le rapport de diagnostic.Waiting between button clicks makes it easier to isolate the button click routines in the diagnostic report.

  5. Quand apparaît la deuxième ligne de sortie, choisissez Arrêter la collecte dans le hub Performances et diagnostics.After the second output line appears, choose Stop Collection in the Performance and Diagnostic hub.

    Arrêter la collecte des données CpuUsageStop CpuUsage data collection

    L'outil Utilisation de l'UC analyse les données et affiche le rapport.The CPU Usage tool analyzes the data and displays the report.

    Rapport CpuUsageCpuUsage report

Analyser le rapport d'utilisation de l'UCAnalyze the CPU Usage report

Arborescence des appels d'utilisation du processeurThe CPU Usage call tree

Pour commencer la présentation des informations sur l'arborescence des appels, sélectionnez de nouveau le segment GetMaxNumberButton_Click et consultez les détails d'arborescence des appels.To get started understanding call tree information, reselect the GetMaxNumberButton_Click segment, and look at the call tree details.

Structure de l’arborescence des appelsCall tree structure

Arborescence des appels GetMaxNumberButton_ClickGetMaxNumberButton_Click call tree

Étape 1Step 1 Le nœud de premier niveau des arborescences d'appels de l'outil Utilisation de l'UC est un pseudo-nœudThe top-level node in CPU Usage call trees is a pseudo-node
Étape 2Step 2 Dans la plupart des applications, quand l'option Afficher le code externe est désactivée, le nœud de deuxième niveau est un nœud [Code externe] contenant le code système et framework qui démarre et arrête l'application, dessine l'interface utilisateur, contrôle la planification des threads et fournit d'autres services de niveau inférieur à l'application.In most apps, when the Show External Code option is disabled, the second-level node is an [External Code] node that contains the system and framework code that starts and stops the app, draws the UI, controls thread scheduling, and provides other low-level services to the app.
Étape 3Step 3 Les enfants du nœud de deuxième niveau sont les méthodes en code utilisateur et des routines asynchrones appelées ou créées par le code système et framework de deuxième niveau.The children of the second-level node are the user-code methods and asynchronous routines that are called or created by the second-level system and framework code.
Étape 4Step 4 Les nœuds enfants d'une méthode contiennent des données seulement pour les appels de la méthode parente.Child nodes of a method contain data only for the calls of the parent method. Lorsque l'option Afficher le Code externe est désactivée, les méthodes d'application peuvent également contenir un nœud [Code externe] .When Show External Code is disabled, app methods can also contain an [External Code] node.

Code externeExternal Code

Le code externe correspond aux fonctions des composants système et infrastructure exécutés par le code que vous écrivez.External code are functions in system and framework components that executed by the code you write. Le code externe inclut les fonctions qui démarrent et arrêtent l'application, dessinent l'interface utilisateur, contrôlent les threads et fournissent d'autres services de bas niveau à l'application.External code include functions that start and stop the app, draw the UI, control threading, and provide other low-level services to the app. Dans la plupart des cas, vous ne serez pas intéressé par le code externe ; par conséquent, l’arborescence des appels de l’utilisation du processeur regroupe les fonctions externes d’une méthode utilisateur en un seul nœud [Code externe] .In most cases, you won't be interested in external code, and so the CPU Usage call tree gathers the external functions of a user method into one [External Code] node.

Quand vous voulez afficher les chemins d'appel du code externe, choisissez Afficher le code externe dans la liste Filtrer la vue , puis Appliquer.When you want to view the call paths of external code, choose Show External Code from the Filter view list and then choose Apply.

Choisir Filtrer l’affichage, puis Afficher le code externeChoose Filter View, then Show External Code

N'oubliez pas que de nombreuses chaînes d'appel en code externe sont profondément imbriquées, la largeur de la colonne Nom de fonction ne peut pas dépasser la largeur d'affichage de presque tous les moniteurs d'ordinateur, sauf les plus larges.Be aware that many external code call chains are deeply nested, so that the width of the Function Name column can exceed the display width of all but the largest of computer monitors. Si tel est le cas, les noms de fonction sont affichés sous forme de […] :When this happens, function names are shown as [...]:

Code externe imbriqué dans l’arborescence des appelsNested external code in the call tree

Utilisez la zone de recherche pour trouver le nœud que vous cherchez, puis utilisez la barre de défilement horizontal pour afficher les données dans la vue :Use the search box to find a node that you are looking for, then use the horizontal scroll bar to bring the data into view:

Rechercher du code externe imbriquéSearch for nested external code

Colonnes des données de l’arborescence des appelsCall tree data columns

Processeur total (%)Total CPU (%) % total, équation de donnéesTotal % data equation

Pourcentage de l'activité du processeur de l'application dans la plage de temps sélectionnée qui a été utilisé par les appels de la fonction et les fonctions appelées par la fonction.The percentage of the app's CPU activity in the selected time range that was used by calls to the function and the functions called by the function. Notez que cette information est différente du graphique chronologique Utilisation du processeur qui compare l'activité totale de l'application dans une plage de temps à la capacité totale disponible de l'UC.Note that this is different from the CPU Utilization timeline graph, which compares the total activity of the app in a time range to the total available CPU capacity.
Processeur auto (%)Self CPU (%) % auto, équationSelf % equation

Pourcentage de l'activité du processeur de l'application dans la plage de temps sélectionnée qui a été utilisé par les appels de la fonction, à l'exclusion de l'activité des fonctions appelées par la fonction.The percentage of the app's CPU activity in the selected time range that was used by the calls to the function, excluding the activity of functions called by the function.
Total processeur (ms)Total CPU (ms) Nombre de millisecondes utilisées par les appels à la fonction dans la plage de temps sélectionnée et les fonctions appelées par la fonction.The number of milliseconds spent in calls to the function in the selected time range and the functions that were called by the function.
Processeur auto (ms)Self CPU (ms) Nombre de millisecondes utilisées par les appels à la fonction dans la plage de temps sélectionnée et les fonctions appelées par la fonction.The number of milliseconds spent in calls to the function in the selected time range and the functions that were called by the function.
ModuleModule Nom du module contenant la fonction, ou le nombre de modules contenant les fonctions dans un nœud [Code externe].The name of the module containing the function, or the number of modules containing the functions in an [External Code] node.

Fonctions asynchrones de l'arborescence des appels de l'utilisation du processeurAsynchronous functions in the CPU Usage call tree

Quand le compilateur rencontre une méthode asynchrone, il crée une classe masquée pour contrôler l’exécution de la méthode.When the compiler encounters an asynchronous method, it creates a hidden class to control the method's execution. Conceptuellement, la classe est une machine à états comprenant la liste des fonctions générées par le compilateur qui appellent les opérations de la méthode d’origine en mode asynchrone, ainsi que les rappels, le planificateur et les itérateurs requis pour les exécuter correctement.Conceptually, the class is a state machine that includes a list of compiler-generated functions that call operations of the original method asynchronously, and the callbacks, scheduler, and iterators required to execute them correctly. Quand la méthode d’origine est appelée par une méthode parente, le runtime supprime la méthode du contexte d’exécution du parent et exécute les méthodes de la classe masquée dans le contexte du code système et du framework qui contrôle l’exécution de l’application.When the original method is called by a parent method, the runtime removes the method from the execution context of the parent, and runs the methods of the hidden class in the context of the system and framework code that control the app's execution. Les méthodes asynchrones sont souvent, mais pas toujours, exécutées sur un ou plusieurs threads différents.The asynchronous methods are often, but not always, executed on one or more different threads. Ce code est affiché dans l'arborescence des appels de l'utilisation du processeur en tant qu'enfants du nœud [Code externe] situé immédiatement sous le nœud supérieur de l'arborescence.This code is shown in the CPU Usage call tree as children of the [External Code] node immediately below the top node of the tree.

Pour le voir dans notre exemple, resélectionnez le segment GetMaxNumberAsyncButton_Click dans la chronologie.To see this in our example, re-select the GetMaxNumberAsyncButton_Click segment in the timeline.

Sélection du rapport GetMaxNumberAsyncButton_ClickGetMaxNumberAsyncButton_Click report selection

Les deux premiers nœuds sous [Code externe] sont les méthodes générées par le compilateur de la classe de la machine d'état.The first two nodes under [External Code] are the compiler-generated methods of the state machine class. Le troisième nœud est l'appel de la méthode d'origine.The third is the call to original method. En développant les méthodes générées, vous obtenez un aperçu de ce qui se passe.Expanding the generated methods shows you what's going on.

Arborescence des appels GetMaxNumberAsyncButton_Click développéeExpanded GetMaxNumberAsyncButton_Click call tree

  • MainPage::GetMaxNumberAsyncButton_Click se contente de gérer la liste des valeurs de la tâche, de calculer le nombre maximal de résultats et d'affiche la sortie.MainPage::GetMaxNumberAsyncButton_Click does very little; it manages a list of the task values, computes the maximum of the results, and displays the output.

  • MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext affiche l'activité requise pour planifier et lancer les 48 tâches qui encapsulent l'appel à GetNumberAsync.MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext shows you the activity required to schedule and launch the 48 tasks that wrap the call to GetNumberAsync.

  • MainPage::<GetNumberAsync>b__b affiche l'activité des tâches qui appellent GetNumber.MainPage::<GetNumberAsync>b__b shows you the activity of the tasks that call GetNumber.