Análisis del uso de CPU sin depurar en el Generador de perfiles de rendimiento
Una buena forma de comenzar a investigar los problemas de rendimiento de la aplicación es entender el uso de CPU. La herramienta de rendimiento Uso de CPU muestra el tiempo de CPU y porcentaje dedicado a ejecutar código en las aplicaciones de C++, C#, Visual Basic y JavaScript.
La herramienta Uso de CPU puede ejecutarse en un proyecto de Visual Studio abierto, en una aplicación instalada de Microsoft Store, o conectarse a una aplicación o un proceso en ejecución. Puede ejecutar la herramienta Uso de CPU con o sin depuración. Para obtener más información, vea Ejecutar herramientas de generación de perfiles con o sin el depurador.
En las siguientes instrucciones se muestra cómo usar la herramienta Uso de CPU sin el depurador, mediante el Generador de perfiles de rendimiento de Visual Studio. Los ejemplos usan una compilación de versión en un equipo local. Las compilaciones de versión proporcionan la mejor vista de rendimiento de la aplicación real. Para analizar el uso de CPU con compilaciones de depuración (depurador asociado), vea Guía básica para la generación de perfiles de rendimiento.
Por lo general, el equipo local replica mejor la ejecución de aplicaciones instaladas. Para recopilar datos de un dispositivo remoto, ejecute la aplicación directamente en el dispositivo en lugar de en una Conexión a Escritorio remoto.
Nota
Se requiere Windows 7 o posterior para usar el Generador de perfiles de rendimiento.
Recopilar datos de Uso de CPU
En el proyecto de Visual Studio, establezca la configuración de la solución en Versión y seleccione Depurador local de Windows (o Equipo local) como el destino de implementación.

Seleccione Depurar > Generador de perfiles de rendimiento.
En Herramientas disponibles seleccione Uso de CPU y después Iniciar.

Después de que se inicie la aplicación, comienza la sesión de diagnóstico y muestra datos de uso de CPU. Cuando haya terminado de recopilar datos, haga clic en Detener recopilación.

La herramienta Uso de CPU analiza y muestra el informe.

Analizar el informe de Uso de CPU
El informe de diagnóstico se ordena por el Total de CPU, de mayor a menor. Puede cambiar el criterio de ordenación o la columna de ordenación seleccionando los encabezados de columna. Use la lista desplegable Filtro para seleccionar o anular la selección de subprocesos para mostrar, y use el cuadro Búsqueda para buscar un subproceso o un nodo concreto.
A partir de Visual Studio 2019, puede hacer clic en los botones Expandir ruta de acceso activa y Mostrar ruta de acceso activa para ver las llamadas de función que usan el porcentaje más alto de CPU en la vista de árbol de las llamadas.
Columnas de datos de uso de CPU
| NOMBRE | Descripción |
|---|---|
| Total de CPU [unidad, porcentaje] | ![]() Los milisegundos y el porcentaje de CPU que usaron las llamadas a la función y las funciones llamadas por la función en el intervalo de tiempo seleccionado. Esto no es lo mismo que el gráfico de línea cronológica Utilización de CPU, que compara la actividad total de CPU en un intervalo de tiempo con el total de CPU disponible. |
| CPU propia [unidad, porcentaje] | ![]() Los milisegundos y el porcentaje de CPU que usaron las llamadas a la función en el intervalo de tiempo seleccionado, sin incluir las funciones llamadas por la función. |
| Módulo | El nombre del módulo que contiene la función. |
Árbol de llamadas de Uso de CPU
Para ver el árbol de llamadas, seleccione el nodo primario en el informe. La página Uso de CPU se abre para la vista Llamador y destinatario. En la lista desplegable Vista actual seleccione Árbol de llamadas.
Estructura del árbol de llamadas


| Imagen | Descripción |
|---|---|
![]() |
El nodo de nivel superior de los árboles de llamadas de Uso de CPU es un pseudonodo. |
![]() |
En la mayoría de las aplicaciones, cuando se desactiva la opción Mostrar código externo, el nodo de segundo nivel es un nodo [Código externo] . El nodo contiene el código del sistema y del marco que inicia y detiene la aplicación, dibuja la interfaz de usuario, controla la programación de subprocesos y ofrece otros servicios de bajo nivel a la aplicación. |
![]() |
Los elementos secundarios del nodo de segundo nivel son los métodos de código de usuario y las rutinas asíncronas llamados o creados por el sistema de segundo nivel y el código de Framework. |
![]() |
Los nodos secundarios de un método contienen datos únicamente de las llamadas del método principal. Cuando está deshabilitada la opción Mostrar código externo , los métodos de aplicación también pueden contener un nodo [Código externo] . |
Código externo
Las funciones del sistema y del marco que ejecuta el código se llaman código externo. Las funciones de código externo inician y detienen la aplicación, dibujan la interfaz de usuario, controlan los subprocesos y proporcionan otros servicios de bajo nivel a la aplicación. En la mayoría de los casos no le interesará el código externo, por lo que el árbol de llamadas de Uso de CPU reúne las funciones externas de un método de usuario en un nodo [Código externo] .
Para ver las rutas de llamada de código externo, en la página de informe de diagnóstico principal (panel derecho), seleccione Mostrar código externo en la lista desplegable Filtro y después haga clic en Aplicar. Después, la vista Árbol de llamadas de la página Uso de CPU expande las llamadas a código externo. (La lista desplegable Filtro está disponible en la página principal de diagnóstico, no en las vistas detalladas).

Muchas cadenas de llamadas de código externo están profundamente anidadas, así que el ancho de la cadena puede superar el ancho de pantalla de la columna Nombre de la función. Los nombres de función aparecen como ... .

Para encontrar un nombre de función que está buscando, use el cuadro de búsqueda. Mantenga el mouse sobre la línea seleccionada o use la barra de desplazamiento horizontal para ver los datos.


Funciones asincrónicas en el árbol de llamadas de Uso de CPU
Cuando el compilador encuentra un método asincrónico, crea una clase oculta para controlar la ejecución del método. Conceptualmente, la clase es una máquina de estados. La clase tiene funciones generadas por el compilador que llaman asincrónicamente a los métodos originales, las devoluciones de llamada, el programador y los iteradores necesarios para ejecutarlos. Cuando un método principal llama al método original, el compilador quita al método del contexto de ejecución del elemento principal y ejecuta los métodos de la clase oculta en el contexto del código del sistema y Framework que controla la ejecución de la aplicación. A menudo, aunque no siempre, los métodos asincrónicos se ejecutan en uno o varios subprocesos diferentes. Este código aparece en el árbol de llamadas de Uso de CPU como elementos secundarios del nodo [Código externo] que se encuentra justo debajo del nodo superior del árbol.
En el siguiente ejemplo, los dos primeros nodos bajo [Código externo] son los métodos generados por el compilador de la clase de la máquina de estados. El tercer nodo es la llamada al método original.

Expanda los métodos generados para mostrar lo que está sucediendo:

MainPage::GetMaxNumberAsyncButton_Clicksolo administra una lista de valores de la tarea, calcula el valor máximo de los resultados y muestra el resultado.MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNextmuestra la actividad necesaria para programar e iniciar las 48 tareas que incluyen la llamada enGetNumberAsync.MainPage::<GetNumberAsync>b__bmuestra la actividad de las tareas que llaman aGetNumber.





