Inicio rápido: Análisis de datos de uso de CPU en Visual Studio (ASP.NET)Quickstart: Analyze CPU usage data in Visual Studio (ASP.NET)

Visual Studio proporciona muchas características eficaces para ayudar a analizar problemas de rendimiento de la aplicación.Visual Studio provides many powerful features to help you analyze performance issues in your application. En este tema se proporciona una forma rápida de obtener información sobre las características básicas.This topic provides a quick way to learn some of the basic features. A continuación, veremos una herramienta para identificar los cuellos de botella de rendimiento debido al uso elevado de la CPU.Here, we look at a tool to identify performance bottlenecks due to high CPU usage. Se admiten las herramientas de diagnóstico para el desarrollo de .NET en Visual Studio, incluido ASP.NET, y para el desarrollo nativo de C++.The Diagnostics Tools are supported for .NET development in Visual Studio, including ASP.NET, and for native/C++ development.

El concentrador de diagnósticos le ofrece muchas otras opciones para ejecutar y administrar la sesión de diagnóstico.The Diagnostic hub offers you a lot of other options to run and manage your diagnostics session. Si la herramienta Uso de CPU que se describe aquí no proporciona los datos que necesita, las demás herramientas de generación de perfiles proporcionan diferentes tipos de información que pueden resultarle útiles.If the CPU Usage tool described here does not give you the data that you need, the other profiling tools provide different kinds of information that might be helpful to you. 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.In many cases, the performance bottleneck of your application may be caused by something other than your CPU, such as memory, rendering UI, or network request time.

Nota

Para .NET Core y ASP.NET Core, la herramienta Uso de CPU actualmente no proporciona resultados precisos con PBD portátiles.For .NET Core and ASP.NET Core, the CPU Usage tool currently does not provide accurate results with portable PBDs. Use PBD completos en su lugar.Use full PDBs instead.

Crear un proyectoCreate a project

  1. En Visual Studio, seleccione Archivo > Nuevo proyecto.In Visual Studio, choose File > New Project.

  2. En Visual C#, seleccione Web y, después, en el panel central, seleccione Aplicación web ASP.NET (.NET Framework).Under Visual C#, choose Web, and then in the middle pane choose ASP.NET Web Application (.NET Framework).

    Nota

    La herramienta Uso de CPU no se admite actualmente en ASP.NET Core.The CPU Usage tool is not currently supported in ASP.NET Core.

  3. Escriba un nombre como MyProfilingApp_MVC y haga clic en Aceptar.Type a name like MyProfilingApp_MVC and click OK.

  4. En el cuadro de diálogo que aparece, seleccione MVC en el panel central y, después, haga clic en Aceptar.In the dialog box that appears, choose MVC in the middle pane, and then click OK.

    Visual Studio crea el proyecto.Visual Studio creates the project. En el Explorador de soluciones (el panel de la derecha) se muestran los archivos de proyecto.Solution Explorer (right pane) shows your project files.

  5. En el Explorador de soluciones, haga clic con el botón derecho en la carpeta de modelos y elija Agregar > Clase.In Solution Explorer, right-click the Models folder and choose Add > Class.

  6. Asigne el nombre Data.cs a la nueva clase y haga clic en Agregar.Name the new class Data.cs and choose Add.

  7. En el Explorador de soluciones, abra Models/Data.cs y agregue la siguiente instrucción using a la parte superior del archivo:In Solution Explorer, open Models/Data.cs and add the following using statement to the top of the file:

    using System.Threading;
    
  8. En Data.cs, reemplace el código siguiente:In Data.cs, replace the following code:

    public class Data
    {
    }
    

    con este código:with this code:

    public class ServerClass
    {
        const int MIN_ITERATIONS = int.MaxValue / 1000;
        const int MAX_ITERATIONS = MIN_ITERATIONS + 10000;
    
        long m_totalIterations = 0;
        readonly object m_totalItersLock = new object();
        // The method that will be called when the thread is started.
        public void GenerateData()
        {
            Console.WriteLine(
                "ServerClass.InstanceMethod is running on another thread.");
    
            var x = GetNumber();
        }
    
        private int GetNumber()
        {
            var rand = new Random();
            var iters = rand.Next(MIN_ITERATIONS, MAX_ITERATIONS);
            var result = 0;
            lock (m_totalItersLock)
            {
                m_totalIterations += iters;
            }
            // we're just spinning here  
            // and using Random to frustrate compiler optimizations  
            for (var i = 0; i < iters; i++)
            {
                result = rand.Next();
            }
            return result;
        }
    }
    
    public class Simple
    {
        int numberOfThreads = 200;
    
        public Simple()
        {
            for (int i = 0; i < numberOfThreads; i++)
            {
                CreateThreads();
            }
        }
        public static void CreateThreads()
        {
            ServerClass serverObject = new ServerClass();
    
            Thread InstanceCaller = new Thread(new ThreadStart(serverObject.GenerateData));
            // Start the thread.
            InstanceCaller.Start();
    
            Console.WriteLine("The Main() thread calls this after "
                + "starting the new InstanceCaller thread.");
    
        }
    
        public int GetData()
        {
            // Not returning any meaningful data.
            return numberOfThreads;
        }
    }
    
  9. En el Explorador de soluciones, abra Controller/HomeControllers.cs y reemplace el código siguiente:In Solution Explorer, open Controller/HomeControllers.cs, and replace the following code:

    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";
    
        return View();
    }
    

    con este código:with this code:

    public ActionResult About()
    {
        Models.Simple s = new Models.Simple();
    
        ViewBag.Message = "Your application description page.";
    
        return View(s.GetData());
    }
    

Paso 1: Recopilar datos de generación de perfilesStep 1: Collect profiling data

  1. En primer lugar, establezca un punto de interrupción en la aplicación en esta línea de código en el constructor Simple:First, set a breakpoint in your app on this line of code in the Simple constructor:

    for (int i = 0; i < 200; i++)

    Para establecer un punto de interrupción, haga clic en el margen interno a la izquierda de la línea de código.Set a breakpoint by clicking in the gutter to the left of the line of code.

  2. Después, establezca un segundo punto de interrupción en la llave de cierre al final del constructor Simple:Next, set a second breakpoint on the closing brace at the end of the Simple constructor:

    Establecer puntos de interrupción para la generación de perfiles

    Sugerencia

    Al establecer dos puntos de interrupción, puede limitar la recopilación de datos a las partes del código que quiere analizar.By setting two breakpoints, you can limit data collection to the parts of code that you want to analyze.

  3. La ventana Herramientas de diagnóstico ya es visible, a menos que se haya desactivado.The Diagnostic Tools window is already visible unless you have turned it off. Para que la ventana se vuelva a mostrar, haga clic en Depurar / Windows / Mostrar herramientas de diagnóstico.To bring up the window again, click Debug / Windows / Show Diagnostic Tools.

  4. Haga clic en Depurar / Iniciar depuración (o Inicio en la barra de herramientas o F5).Click Debug / Start Debugging (or Start on the toolbar, or F5).

  5. Cuando la aplicación termine de cargarse, haga clic en el vínculo Acerca de en la parte superior de la página web para empezar a ejecutar el código nuevo.When the app finishes loading, click the About link at the top of the web page to start running the new code.

  6. Mire la vista Resumen de las Herramientas de diagnóstico que aparece.Look at the Summary view of the Diagnostics Tools appears.

  7. Mientras el depurador está en pausa, habilite la recopilación de datos de uso de la CPU mediante la selección de Registrar perfil CPU y, después, abra la pestaña Uso de CPU.While the debugger is paused, enable the collection of the CPU Usage data by choosing Record CPU Profile, and then open the CPU Usage tab.

    Herramientas de diagnóstico para habilitar la generación de perfiles de CPU

    Cuando se habilita la recopilación de datos, el botón de grabación muestra un círculo rojo.When data collection is enabled, the record button displays a red circle.

    Al seleccionar Registrar perfil CPU, Visual Studio iniciará la grabación de las funciones y cuánto tiempo se tardan en ejecutar, y también proporciona un gráfico de escala de tiempo que se puede usar para centrarse en segmentos específicos de la sesión de muestreo. Estos datos recopilados solo se pueden ver cuando la aplicación se detiene en un punto de interrupción.When you choose Record CPU Profile, Visual Studio will begin recording your functions and how much time they take to execute, and also provides a timeline graph you can use to focus on specific segments of the sampling session.You can only view this collected data when your application is halted at a breakpoint.

  8. Presione F5 para ejecutar la aplicación hasta el segundo punto de interrupción.Hit F5 to run the app to your second breakpoint.

    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.Now, you now have performance data for your application specifically for the region of code that runs between the two breakpoints.

    El generador de perfiles empieza a preparar los datos de subproceso.The profiler begins preparing thread data. Espere a que finalice.Wait for it to finish.

    La herramienta Uso de CPU muestra el informe en la pestaña Uso de CPU.The CPU Usage tool displays the report in the CPU Usage tab.

    En este punto, puede empezar a analizar los datos.At this point, you can begin to analyze the data.

Paso 2: Analizar datos de uso de CPUStep 2: Analyze CPU usage data

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.We recommend that you begin analyzing your data by examining the list of functions under CPU Usage, identifying the functions that are doing the most work, and then taking a closer look at each one.

  1. En la lista de funciones, examine las funciones que realizan la mayor parte del trabajo.In the function list, examine the functions that are doing the most work.

    Pestaña 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).Functions are listed in order starting with those doing the most work (they're not in call order). Esto ayuda a identificar rápidamente las funciones que se ejecutan durante más tiempo.This helps you quickly identify the longest running functions.

  2. En la lista de funciones, haga doble clic en la función MyProfilingApp_MVC.Models.ServerClass::GetNumber.In the function list, double-click the MyProfilingApp_MVC.Models.ServerClass::GetNumber function.

    Al hacer doble clic en la función, se abre la vista Llamador y destinatario en el panel de la izquierda.When you double-click the function, the Caller/Callee view opens in the left pane.

    Vista Llamador de 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, ServerClass::GetNumber).In this view, the selected function shows up in the heading and in the Current Function box (ServerClass::GetNumber, in this example). La función que llamó a la función actual se muestra a la izquierda en Función llamadora, y las funciones llamadas por la función actual se muestran a la derecha en el cuadro Funciones llamadas.The function that called the current function is shown on the left under Calling Function, and any functions called by the current function are shown in Called Functions box on the right. (Puede seleccionar cualquiera de los cuadros para cambiar la función actual).(You can select either box to change the current function.)

    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.This view shows you the total time (ms) and the percentage of the overall app running time that the function has taken to complete.

    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.Function Body also shows you the total amount of time (and the percentage of time) spent in the function body excluding time spent in calling and called functions. (En este ejemplo, 2220 de 2235 ms se dedicaron al cuerpo de la función y el tiempo restante (<20 ms) se dedicó al código externo al que esta función llama).(In this illustration, 2220 out of 2235 ms were spent in the function body, and the remaining time (<20 ms) was spent in external code called by this function). Los valores reales serán diferentes en función del entorno.Actual values will be different depending on your environment.

    Sugerencia

    Los valores altos en Cuerpo de la función pueden indicar un cuello de botella de rendimiento dentro de la propia función.High values in Function Body may indicate a performance bottleneck within the function itself.

Pasos siguientesNext steps

Vea tambiénSee Also

Generación de perfiles en Visual StudioProfiling in Visual Studio
Guía de características de generación de perfilesProfiling feature tour