Medición del rendimiento de aplicaciones mediante el análisis de uso de CPU (C#, Visual Basic, C++, F#)
Busque problemas de rendimiento al realizar la depuración con la herramienta de diagnóstico Uso de CPU integrada en el depurador. También puede analizar el uso de CPU sin un depurador asociado o si establece como destino una aplicación en ejecución. Para obtener más información, vea Ejecutar herramientas de generación de perfiles con o sin el depurador.
Cuando el depurador se pausa, la herramienta Uso de CPU de la ventana Herramientas de diagnóstico recopila información sobre las funciones que se ejecutan en la aplicación. La herramienta enumera las funciones que realizaron trabajo y proporciona un gráfico de escala de tiempo que se puede utilizar para centrarse en segmentos específicos de la sesión de muestreo.
Importante
Las Herramientas de diagnóstico integradas en el depurador se admiten para el desarrollo de .NET en Visual Studio, incluido ASP.NET, ASP.NET Core y para el desarrollo nativo o de C++. Se requiere la carga de trabajo de Visual Studio correspondiente. Para ejecutar las herramientas de generación de perfiles con el depurador se requiere Windows 8 y versiones posteriores (ventana Herramientas de diagnóstico).
En este tutorial va a:
- Recopilar datos de Uso de CPU
- Analizar datos de uso de CPU
Si Uso de CPU no le proporciona los datos que necesita, las demás herramientas de generación de perfiles del Generador de perfiles de rendimiento proporcionan distintos tipos de información que pueden resultarle útiles. En muchos casos, el cuello de botella de rendimiento de la aplicación puede no ser debido a la CPU, sino a la memoria, la representación de interfaz de usuario o el tiempo de solicitud de red.
Paso 1: recopilar datos de uso de CPU
Abra el proyecto que desee depurar en Visual Studio y establezca un punto de interrupción de la aplicación en el punto en que quiera examinar el uso de CPU.
Establezca un segundo punto de interrupción al final de la función o la región de código que quiera analizar.
Al establecer dos puntos de interrupción, puede limitar la recopilación de datos a las partes del código que quiere analizar.
La ventana Herramientas de diagnóstico aparece automáticamente a no ser que la desactive. Para que la ventana se vuelva a mostrar, haga clic en Depurar>Windows>Mostrar Herramientas de diagnóstico.
Puede elegir si ve Uso de CPU, Uso de memoria o ambos con el ajuste Seleccionar herramientas en la barra de herramientas. Si ejecuta Visual Studio Enterprise, puede habilitar o deshabilitar IntelliTrace en Herramientas>Opciones>IntelliTrace.
Nos fijaremos principalmente en el uso de CPU, así que asegúrese de que Uso de CPU está habilitado (lo está de forma predeterminada).
Haga clic en Depurar>Iniciar depuración (o en Inicio en la barra de herramientas, o presione F5).
Cuando la aplicación finaliza la carga, se muestra la vista Resumen de las herramientas de diagnóstico. Si necesita abrir la ventana, haga clic en Depurar>Windows>Mostrar herramientas de diagnóstico.
Para obtener más información sobre los eventos, vea Searching and filtering the Events tab of the Diagnostic Tools window (Búsqueda y filtrado de la pestaña Eventos de la ventana de herramientas de diagnóstico).
Ejecute el escenario que hará que se alcance el primer punto de interrupción.
Mientras el depurador está en pausa, habilite la recopilación de datos de uso de CPU y, a continuación, abra la pestaña Uso de CPU.
Cuando se elige Registrar perfil CPU, Visual Studio empezará a registrar las funciones y cuánto tiempo tardan en ejecutarse. Solo puede ver los datos recopilados cuando la aplicación se detiene en un punto de interrupción.
Presione F5 para ejecutar la aplicación hasta el segundo punto de interrupción.
Ahora tiene los datos de rendimiento de la aplicación específicamente para la región de código que se ejecuta entre los dos puntos de interrupción.
El generador de perfiles empieza a preparar los datos de subproceso. Espere a que finalice.
La herramienta Uso de CPU muestra el informe en la pestaña Uso de CPU.
Si desea seleccionar una región de código más específica para analizar, seleccione una región en la escala de tiempo de CPU (debe ser una región que muestre los datos de generación de perfiles).
En este punto, puede empezar a analizar los datos. Si tiene problemas para recopilar o mostrar datos, consulte Solución de problemas en la generación de perfiles y corrección de problemas.
Sugerencia
Al tratar de identificar las incidencias de rendimiento, realice varias medidas. El rendimiento varía de forma natural entre ejecuciones, y las rutas de acceso al código normalmente se ejecutan más lentamente la primera vez que se ejecutan debido a un trabajo de inicialización único, como la carga de archivos DLL, los métodos de compilación JIT y la inicialización de memorias caché. Al tomar varias medidas, se obtiene una idea más clara del rango y el valor medio de la métrica que se muestra, lo que permite realizar una comparación entre el rendimiento de la primera vez y el de un estado estable de un área de código.
Paso 2: Analizar datos de uso de CPU
Se recomienda que, para empezar a analizar los datos, examine la lista de funciones de Uso de CPU, identifique las funciones que realizan la mayor parte del trabajo y, a continuación, observe detenidamente cada una de ellas.
En la lista de funciones, examine las funciones que realizan la mayor parte del trabajo.
Sugerencia
Las funciones aparecen en orden, comenzando por las que realizan la mayor parte del trabajo (no están en orden de llamada). Esto ayuda a identificar rápidamente las funciones que se ejecutan durante más tiempo.
En la lista de funciones, haga doble clic en una de las funciones de aplicación que realice mucho trabajo.
Al hacer doble clic en una función, la vista Funciones se abre en el panel izquierdo. Seleccione la vista Llamador y destinatario en el menú desplegable.
En esta vista, la función seleccionada se muestra en el título y en el cuadro Función actual (en este ejemplo, DoWork). La función que llamó a la función actual se muestra a la izquierda en Funciones de llamada, y las funciones llamadas por la función actual se muestran a la derecha en el cuadro Funciones llamadas. (Puede seleccionar cualquiera de los cuadros para cambiar la función actual).
En esta vista se muestra el tiempo total (ms) y el porcentaje del tiempo de ejecución global de la aplicación que la función ha tardado en completarlo. Cuerpo de la función también muestra la cantidad total de tiempo (y el porcentaje de tiempo) empleado en el cuerpo de la función, excluido el tiempo invertido en las funciones llamadoras y llamadas.
Al hacer doble clic en una función, la vista Llamador y destinatario se abre en el panel izquierdo.
En esta vista, la función seleccionada se muestra en el encabezado y en el cuadro Función actual (en este ejemplo, GetNumber). La función que llamó a la función actual se muestra a la izquierda en Funciones de llamada, y las funciones llamadas por la función actual se muestran a la derecha en el cuadro Funciones llamadas. (Puede seleccionar cualquiera de los cuadros para cambiar la función actual).
En esta vista se muestra el tiempo total (ms) y el porcentaje del tiempo de ejecución global de la aplicación que la función ha tardado en completarlo. Cuerpo de la función también muestra la cantidad total de tiempo (y el porcentaje de tiempo) empleado en el cuerpo de la función, excluido el tiempo invertido en las funciones llamadoras y llamadas. (En este ejemplo, 2367 de 2389 ms se dedicaron al cuerpo de la función y los 22 ms restantes se dedicaron al código externo al que esta función llama).
Sugerencia
Los valores altos en Cuerpo de la función pueden indicar un cuello de botella de rendimiento dentro de la propia función.
Para obtener una vista de nivel superior en la que se muestre el orden en que las funciones se llaman, seleccione Árbol de llamadas en la lista desplegable en la parte superior del panel.
Cada área numerada de la ilustración se corresponde con un paso del procedimiento.
Image 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, si la opción Mostrar código externo está deshabilitada, el nodo de segundo nivel es un nodo [Código externo] que contiene el código del sistema y Framework que inicia y detiene la aplicación, dibuja la IU, 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] . Aquí encontrará más información sobre los valores de columna:
CPU total indica cuánto trabajo realizaron la función y las funciones llamadas por ella. Los valores altos de CPU total señalan las funciones que consumen más en general.
Solo CPU indica cuánto trabajo realizó el código del cuerpo de la función, sin incluir el trabajo de las funciones llamadas por dicha función. Los valores altos de Solo CPU pueden indicar un cuello de botella de rendimiento dentro de la propia función.
Módulos El nombre del módulo que contiene la función o el número de módulos que contienen las funciones en un nodo [Código externo].
Para ver las llamadas de función que utilizan el porcentaje más alto de la CPU en la vista de árbol de llamadas, haga clic en Expandir ruta de acceso activa.
Nota:
Si ve el código en el árbol de llamadas marcado como código "broken" o "unwalkable stack", esto indica que es probable que se hayan quitado los eventos de Seguimiento de eventos para Windows (ETW). Pruebe a recopilar el mismo seguimiento una segunda vez para resolver el problema.
Ver código externo
El código externo son funciones de los componentes del sistema y del marco que son ejecutadas por el código que escribe. El código externo incluye funciones que inician y detienen la aplicación, dibujan la UI, 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 la herramienta Uso de CPU reúne las funciones externas de un método de usuario en un nodo [Código externo] .
Si quiere ver las rutas de acceso a las llamadas de código externo, elija Mostrar código externo en la lista Vista de filtro y luego Aplicar.
Tenga en cuenta que muchas cadenas de llamadas de código externo están profundamente anidadas, así que el ancho de la columna Nombre de la función puede superar el ancho de pantalla de todos los monitores, excepto de los más grandes. Si ese es el caso, los nombres de función se muestran como […] .
Utilice el cuadro de búsqueda para localizar un nodo que esté buscando y, luego, utilice la barra de desplazamiento horizontal para visualizar los datos.
Sugerencia
Si genera perfiles de un código externo que llama a funciones de Windows, asegúrese de que dispone de los archivos .pdb más recientes. Sin estos archivos, las vistas de informe mostrarán nombres de funciones de Windows crípticos y difíciles de entender. Para más información sobre cómo asegurarse de que tiene los archivos necesarios, consulte Especificar archivos de símbolos (.pdb) y de código fuente en el depurador.
Pasos siguientes
En este tutorial, ha aprendido cómo recopilar y analizar los datos de uso de la CPU. Si ya ha completado el recorrido por el perfilador, puede que desee leer sobre un enfoque general para optimizar el código utilizando las herramientas de perfilado.
En este tutorial, ha aprendido cómo recopilar y analizar los datos de uso de la CPU durante la depuración. Es posible que quiera obtener más información sobre la generación de perfiles en las versiones de lanzamiento mediante el generador de perfiles de rendimiento.