Compartir a través de


Medición del rendimiento de la aplicación mediante el análisis del 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 tener como destino una aplicación en ejecución. Para obtener más información, consulte Ejecución de herramientas de generación de perfiles en compilaciones de versión o depuración y Análisis del rendimiento mediante la generación de perfiles de CPU.

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 estaban realizando el trabajo y proporciona un gráfico de escala de tiempo que puede usar para centrarse en segmentos específicos de la sesión de muestreo.

Importante

Las herramientas de diagnóstico integradas en el depurador están respaldadas para el desarrollo de .NET en Visual Studio, incluyendo ASP.NET y ASP.NET Core, así como para el desarrollo nativo con 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, hará lo siguiente:

  • Recopilación de datos de uso de CPU
  • Análisis de los datos de uso de CPU

Paso 1: Recopilar datos de uso de CPU

  1. Abra el proyecto que desea depurar en Visual Studio y establezca un punto de interrupción en la aplicación en el punto en el que desea examinar el uso de la CPU.

  2. Establezca un segundo punto de interrupción al final de la función o región del código que desea analizar.

    Al establecer dos puntos de interrupción, puede limitar la recopilación de datos a las partes del código que desea analizar.

  3. La ventana de herramientas de diagnóstico aparece automáticamente a menos que la haya desactivado. Para que la ventana se vuelva a mostrar, haga clic en Depurar>Windows>Mostrar Herramientas de diagnóstico.

  4. 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, también puede habilitar o deshabilitar IntelliTrace en Tools>Options>IntelliTrace.

    Captura de pantalla que muestra herramientas de diagnóstico.

    Captura de pantalla que muestra herramientas de diagnóstico.

    Vamos a examinar principalmente el uso de la CPU, por lo que debe asegurarse de que uso de CPU está habilitado (está habilitado de forma predeterminada).

  5. Haga clic en Depurar>Iniciar depuración (o en Inicio en la barra de herramientas, o presione F5).

    Cuando la aplicación termine de cargarse, aparece la vista Resumen de las herramientas de diagnóstico. Si necesita abrir la ventana, haga clic en Depurar>Windows>Mostrar Herramientas de diagnóstico.

    Captura de pantalla que muestra la pestaña Resumen de herramientas de diagnóstico.

    Captura de pantalla que muestra la pestaña Resumen de herramientas de diagnóstico.

    Para obtener más información sobre los eventos, vea Búsqueda y filtrado de la pestaña Eventos de la ventana Herramientas de diagnóstico.

  6. Ejecute el escenario que hará que se alcance el primer punto de interrupción.

  7. 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.

    Captura de pantalla que muestra herramientas de diagnóstico para habilitar la generación de perfiles de CPU.

    Captura de pantalla que muestra herramientas de diagnóstico para habilitar la generación de perfiles de CPU.

    Al elegir Grabar perfil de CPU, Visual Studio comenzará a grabar las funciones y cuánto tiempo tardan en ejecutarse. Solo puede ver estos datos recopilados cuando la aplicación se detiene en un punto de interrupción.

  8. Pulse F5 para ejecutar la aplicación hasta tu segundo punto de interrupción.

    Ahora tiene datos de rendimiento para 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.

    Captura de pantalla que muestra herramientas de diagnóstico preparando subprocesos.

    Captura de pantalla que muestra herramientas de diagnóstico preparando subprocesos.

    La herramienta Uso de CPU muestra el informe en la pestaña Uso de CPU.

    Captura de pantalla que muestra la pestaña

    Captura de pantalla que muestra la pestaña de Uso de CPU en las herramientas de diagnóstico.

  9. Si desea seleccionar una región más específica del código que se va a 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).

    es-ES: Captura de pantalla que muestra herramientas de diagnóstico seleccionando un segmento de tiempo.

    Captura de pantalla que muestra herramientas de diagnóstico que seleccionan un segmento de tiempo.

    En este momento, puede empezar a analizar los datos. Si tiene problemas para recopilar o mostrar datos, consulte Solución de problemas de generación de perfiles y corrección de problemas.

    Sugerencia

    Al intentar identificar problemas de rendimiento, tome varias medidas. El rendimiento varía de manera natural de ejecución a ejecución, y las rutas de código normalmente se ejecutan más lentamente la primera vez, debido a tareas de inicialización únicas, como la carga de DLL, la compilación JIT de métodos y la inicialización de cachés. Al tomar varias medidas, obtendrá una mejor idea del intervalo y la mediana de la métrica que se muestra, lo que le permite comparar la primera vez con el rendimiento de estado estable de un área de código.

Paso 2: Análisis de los datos de uso de CPU

Se recomienda empezar a analizar los datos mediante el examen de la lista de funciones en Uso de CPU, la identificación de las funciones que realizan más trabajo y, a continuación, echar un vistazo más detalladamente a cada una.

  1. En la lista de funciones, examine las funciones que más funcionan.

    Captura de pantalla que muestra la lista de funciones de uso de CPU de las herramientas de diagnóstico.

    Captura de pantalla que muestra la lista de funciones de uso de CPU de Herramientas de diagnóstico.

    Sugerencia

    Las funciones se muestran en orden a partir de las que realizan la mayor parte del trabajo (no están en orden de llamada). Esto le ayuda a identificar rápidamente las funciones de ejecución más largas.

  2. En la lista de funciones, haga doble clic en una de las funciones de la aplicación que está haciendo mucho trabajo.

    Al hacer doble clic en una función, la vista de funciones se abre en el panel izquierdo. Seleccione la vista Llamador y destinatario en el menú desplegable.

    Captura de pantalla que muestra la vista del autor y el destinatario de la llamada de las herramientas de diagnóstico.

    En esta vista, la función seleccionada se muestra en el encabezado y en el cuadro Función actual (DoWork, en este ejemplo). 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).

    Esta vista muestra el tiempo total (ms) y el porcentaje del tiempo de ejecución de la aplicación general que la función ha tardado en completarse. 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.

    Captura de pantalla que muestra la vista del autor y el destinatario de la llamada de las herramientas de diagnóstico.

    En esta vista, la función seleccionada se muestra en el encabezado y en el cuadro Función actual (GetNumber, en este ejemplo). 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).

    Esta vista muestra el tiempo total (ms) y el porcentaje del tiempo de ejecución de la aplicación general que la función ha tardado en completarse. 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 gastaron en el cuerpo de la función y los 22 ms restantes se gastaron en código externo llamado por esta función).

    Sugerencia

    Los valores altos en Cuerpo de la función pueden indicar un cuello de botella de rendimiento dentro de la propia función.

  3. Para ver una vista de nivel superior en la que se muestra el orden en el que se llama a las funciones, seleccione árbol de llamadas en la lista desplegable de la parte superior del panel.

    Cada área numerada de la ilustración se relaciona con un paso del procedimiento.

    Árbol de llamadas Árbol de llamadas en Herramientas de diagnóstico

    Imagen Descripción
    paso 1 El nodo superior en el árbol de llamadas de Uso de CPU, que representa la aplicación.
    paso 2 En la mayoría de las aplicaciones, cuando 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 del marco que inicia y detiene la aplicación, dibuja la interfaz de usuario, controla la programación de subprocesos y proporciona otros servicios de bajo nivel a la aplicación.
    paso 3 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.
    paso 4 Los nodos secundarios de un método contienen datos solo para las llamadas del método primario. Cuando Mostrar código externo está deshabilitado, los métodos de la aplicación también pueden contener un nodo [Código externo].

    A continuación se muestra más información sobre los valores de columna:

    • Total de CPU indica cuánto trabajo realizó la función y las funciones que invoca. Los valores de CPU totales elevados apuntan a las funciones más costosas 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. La ruta de acceso activa puede ayudar a centrar su investigación en el área que tendría el mayor impacto.

    Captura de pantalla que muestra la ruta de acceso activa de las Herramientas de diagnóstico.

    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). Intente recoger la misma traza una segunda vez para resolver el problema.

  4. Para ver una visión diferente de los datos, seleccione Flame Graph en la lista desplegable situada en la parte superior del panel.

    El gráfico de llamas proporciona una visualización diferente del árbol de llamadas que puede ayudarle a analizar los datos. Para obtener más información, consulte Identificar rutas críticas con un gráfico de llamas.

Visualización del código externo

El código externo son funciones en componentes del sistema y del framework que son ejecutadas por el código que usted escribe. El código externo incluye funciones que inician y detienen la aplicación, dibujan la interfaz de usuario, controlan el subproceso 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 y, por tanto, la herramienta Uso de CPU recopila las funciones externas de un método de usuario en un nodo [Llamada externa].

Si quiere ver las rutas de acceso de llamada del código externo, anule la selección de Mostrar solo mi código en la lista Configuración y elija Aplicar.

Captura de pantalla que muestra Configuración y, a continuación, Mostrar solo mi código.

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 interfaz de usuario, controlan el subproceso y proporcionan otros servicios de bajo nivel a la aplicación. En la mayoría de los casos, no estará interesado en el código externo, por lo que la herramienta Uso de CPU recopila 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.

Captura de pantalla que muestra Elegir vista de filtro y, a continuación, Mostrar código externo.

Tenga en cuenta que muchas cadenas de llamadas de código externo están profundamente anidadas, por lo que el ancho de la columna Nombre de función puede superar el ancho de visualización de todos, excepto el de los monitores más grandes. Cuando esto sucede, los nombres de función se muestran como [...].

Use el cuadro de búsqueda para buscar un nodo que busca y, a continuación, use la barra de desplazamiento horizontal para que los datos se vean.

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 los nombres de función de Windows que son 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 a recopilar y analizar datos de uso de CPU. Si ya completó el recorrido del generador de perfiles, puede que quiera seguir un tutorial que muestre cómo usar las herramientas de forma más eficaz.

En este tutorial, ha aprendido cómo recopilar y analizar los datos de uso de la CPU durante la depuración. Es posible que desee obtener más información sobre cómo realizar perfiles en las compilaciones de lanzamiento mediante el Generador de perfiles de rendimiento.