Compartir a través de


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, 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 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 son compatibles con el desarrollo de .NET en Visual Studio, incluidos ASP.NET, ASP.NET Core, y el desarrollo nativo en 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:

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

Paso 1: recopilación de datos de uso de CPU

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

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

  3. La ventana 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, puede habilitar o deshabilitar IntelliTrace en Herramientas>Opciones>IntelliTrace.

    Recorte de pantalla que muestra herramientas de diagnóstico.

    Recorte de pantalla que muestra herramientas de diagnóstico.

    Nos fijaremos principalmente en el uso de CPU, así que asegúrese de que Uso de CPU está habilitado (lo está 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 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.

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

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

    Para obtener más información sobre los eventos, consulte Búsqueda y filtrado de la pestaña Eventos de la ventana de 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.

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

    Recorte de pantalla que muestra herramientas de diagnóstico para habilitar la generación de perfiles 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.

  8. Presione F5 para ejecutar la aplicación hasta tu 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.

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

    Recorte de pantalla que muestra la pestaña Uso de CPU de herramientas de diagnóstico.

    Recorte de pantalla que muestra la pestaña Uso de CPU de herramientas de diagnóstico.

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

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

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

    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: análisis de 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.

  1. En la lista de funciones, examine las funciones que realizan la mayor parte del trabajo.

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

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

    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.

  2. 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, se abre la vista Funciones 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 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.

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

    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.

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

    Árbol de Llamadas de Herramientas de Diagnóstico Á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, 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.
    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 ú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. 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 Principal de 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). Pruebe a recopilar el mismo seguimiento una segunda vez para resolver el problema.

  1. Para ver una vista diferente de los datos, seleccione Flame Graph en la lista desplegable 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 Identificación de rutas críticas con un gráfico de flama.

  2. Para ver las vistas de los datos agregados por función o módulo, seleccione Functions o Módulos en la lista desplegable de la parte superior del panel.

    Estas vistas ayudan a identificar funciones o módulos que podrían ser cuellos de botella de rendimiento debido a una combinación de altos recuentos de llamadas o problemas de rendimiento.

    Captura de pantalla que muestra la vista de funciones de las herramientas de diagnóstico.

Ver código externo

El código externo son funciones en componentes del sistema y del marco que son ejecutadas por el código que tú escribes. 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 [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.

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

El código externo son funciones en componentes del sistema y del marco que son ejecutadas por el código que tú escribes. 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 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.

Recorte 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, 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 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 quiera obtener más información sobre la generación de perfiles en las versiones de lanzamiento mediante el generador de perfiles de rendimiento.