Contenido principal

Perfilar código para mejorar el rendimiento

¿Qué es el perfilado?

El perfilado es una manera de medir cuánto tiempo lleva ejecutar código e identificar dónde MATLAB® emplea la mayor parte del tiempo. Después de identificar las funciones que consumen la mayor parte del tiempo, puede evaluarlas para obtener posibles mejoras de rendimiento. También puede perfilar el código para determinar qué líneas de código no se ejecutan. Determinar qué líneas de código no se ejecutan es útil cuando se llevan a cabo tests del código o como herramienta de depuración para ayudar a aislar un problema en el código.

Puede perfilar el código de manera interactiva utilizando MATLAB Profiler o de forma programática utilizando la función profile. Para obtener más información acerca del perfilado de código de forma programática, consulte profile. Si está perfilando código que se ejecuta en paralelo, utilice el perfilador paralelo Parallel Computing Toolbox™ para obtener un mejor resultado. Para obtener más detalles, consulte Profiling Parallel Code (Parallel Computing Toolbox).

Sugerencia

Si el código se optimiza de forma prematura, puede quedar innecesariamente complejo y no proporcionar una mejora de rendimiento significativa. Haga su primera implementación lo más sencilla posible. Luego, si la velocidad resulta ser un problema, utilice el perfilado para identificar cuellos de botella.

Perfilar código

Para perfilar código y mejorar su rendimiento, utilice este proceso general:

  1. Ejecute Profiler sobre su código.

  2. Revise los resultados del resumen de perfilado.

  3. Investigue funciones y líneas de código individuales.

    Por ejemplo, es posible que le interese investigar funciones y líneas de código que utilizan una cantidad significativa de tiempo o a las que se llama con mayor frecuencia.

  4. Guarde los resultados del perfilado.

  5. Implemente posibles mejoras de rendimiento en el código.

    Por ejemplo, si tiene una instrucción load dentro de un bucle, es posible que pueda mover la instrucción load fuera del bucle, de forma que se llame solamente una vez.

  6. Guarde los archivos y ejecute clear all. Ejecute Profiler de nuevo y compare los resultados con los originales.

  7. Repita los pasos anteriores para seguir mejorando el rendimiento del código. Cuando el código emplea la mayor parte del tiempo en llamadas a unas pocas funciones integradas, probablemente ha optimizado el código al máximo.

Ejecutar Profiler sobre su código

Para ejecutar Profiler en una línea de código:

  1. Abra Profiler yendo a la pestaña Apps y, en MATLAB, haciendo clic en el icono de la app Profiler. También puede escribir profile viewer en la ventana de comandos.

  2. Vaya a la pestaña Profiler y, en la sección Profile, introduzca el código que desee perfilar en el cuadro de edición.

    Por ejemplo, cree una función solvelotka.m que halle los picos de población de presas y depredadores para el ejemplo de Lotka-Volterra proporcionado con MATLAB:

    function [preypeaks,predatorpeaks] = solvelotka(t0, tfinal, y0)
        [~,y] = ode23(@lotka,[t0 tfinal],y0);
        
        preypeaks = calculatepeaks(y(:,1));
        predatorpeaks = calculatepeaks(y(:,2));
        
    end
    
    function peaks = calculatepeaks(A)
        [TF,P] = islocalmax(A);
        peaks = P(TF);
    end
    Introduzca esta instrucción en el cuadro de edición para perfilar la función solvelotka:
    [preypeaks,predatorpeaks] = solvelotka(0,15,[20;20])

    Si perfiló previamente la instrucción en la sesión de MATLAB actual, también puede seleccionarla de la lista desplegable del cuadro de edición.

  3. Haga clic en Run and Time.

    Una vez finalizado el perfilado, Profiler muestra los resultados en Profile Summary. Las instrucciones que haya perfilado también se muestran como ejecutadas en la ventana de comandos.

Para perfilar un archivo de código abierto en el editor, en la pestaña Editor, en la sección Run, seleccione Run > Run and Time. Profiler perfila el archivo de código abierto en la pestaña actual del editor y muestra los resultados en Profile Summary.

Revisar los resultados de Profile Summary

Después de ejecutar Profiler sobre su código, Profile Summary presenta estadísticas sobre la ejecución general del código y proporciona estadísticas de resumen para cada función a la que se ha llamado. Por ejemplo, la siguiente imagen muestra el resumen de Profile Summary para la función solvelotka.

Profiler window with the Profile Summary showing a flame graph of the solvelotka function and a table showing the run times for each function called

En la parte superior de los resultados de Profile Summary, una gráfica de llamas muestra una representación visual del tiempo que MATLAB ha empleado en ejecutar el código. Cada función que se ha ejecutado se representa por una barra en la gráfica de llamas. Las funciones definidas por el usuario se muestran en azul y las funciones de MathWorks® se muestran en gris.

Las funciones de la gráfica se muestran en orden jerárquico, con las funciones principales en la parte inferior de la gráfica y las funciones secundarias, en la parte superior. La barra que se extiende por toda la parte inferior de la gráfica con la etiqueta Profile Summary representa todo el código que se ha ejecutado. La anchura de una barra en la gráfica representa la cantidad de tiempo que ha empleado la función en ejecutarse como un porcentaje del total del tiempo de ejecución.

Para ver los valores reales de porcentaje y tiempo, así como el nombre completo de la función, coloque el cursor sobre la barra en la gráfica. Para mostrar información detallada sobre una función, incluyendo información sobre líneas de código individuales, haga clic en la barra que representa esa función.

Flame graph of the solvelotka function with a tooltip showing the actual percentage and time values of the solvelotka>calculatepeaks function

La tabla de funciones debajo del marco de la llama muestra información similar a la de la gráfica de llamas. Inicialmente las funciones aparecen ordenadas según cuánto tiempo tardaron en procesarse. Esta tabla describe la información de cada columna.

ColumnaDescripción
Function Name

Nombre de la función llamada por el código perfilado.

Calls

Número de veces que el código perfilado ha llamado a la función.

Total Time

Tiempo total empleado en la función, en segundos. El tiempo para la función incluye el tiempo empleado en funciones secundarias. Profiler en sí mismo tarda cierto tiempo, que se incluye en los resultados. El tiempo total puede ser cero para archivos cuyo tiempo de ejecución sea intrascendente.

Self Time

Tiempo total en segundos empleado en una función, excluyendo el tiempo empleado en cualquier función secundaria. El tiempo propio también incluye algo de carga adicional como resultado del proceso de perfilado.

Total Time Plot

Visualización de la gráfica que muestra el tiempo propio en comparación con el tiempo total.

Para ordenar la tabla de funciones por una columna específica, haga clic en la flecha en el encabezado de columna. Por ejemplo, haga clic en la flecha en la columna Function Name para ordenar alfabéticamente las funciones. Inicialmente, los resultados aparecen ordenados por Total Time. Para mostrar información detallada sobre una función, incluyendo información sobre líneas de código individuales, haga clic en el nombre de la función.

Investigar funciones y líneas de código individuales

Para encontrar mejoras potenciales en el código, busque funciones en la gráfica de llamas o en la tabla de funciones que utilizan una cantidad significativa de tiempo o a las que se llama con mayor frecuencia. Haga clic en el nombre de una función para mostrar información detallada sobre la función, incluyendo información sobre líneas de código individuales. Por ejemplo, haga clic en la función solvelotka>calculatepeaks. Profiler muestra información detallada para la función.

Profiler window showing detailed information for the solvelotka>calculatepeaks function, including a flame graph, a table of calling functions, and a table of lines that take the longest to run

En la parte superior de la página, al lado del nombre de la función actual, Profiler muestra el número de veces que una función principal llamó a la función y el tiempo total empleado en la función. Utilice los enlaces que se muestran debajo de la gráfica de llamas para abrir la función en su editor predeterminado o copie los resultados que se muestran en una ventana separada.

Para volver al resumen de perfilado, en la pestaña Profiler, haga clic en el botón Profile Summary. También puede hacer clic en la barra Profile Summary en la parte inferior de la gráfica de llamas.

Una vez haya hecho clic en una función individual, Profiler muestra información adicional en estas secciones:

SecciónDetalles
Flame Graph

Gráfica de llamas que muestra una representación visual del tiempo que MATLAB ha empleado en ejecutar la función perfilada. La gráfica muestra la jerarquía de la función perfilada, incluyendo funciones secundarias (que se muestran encima de la función actual) y funciones principales (que se muestran debajo de la función actual). Las funciones definidas por el usuario se muestran en azul () y las funciones de MathWorks se muestran en gris ().

Coloque el cursor sobre la barra en la gráfica para ver los valores reales de porcentaje y tiempo, así como el nombre completo de la función. Haga clic en una barra que represente a una función para mostrar información detallada sobre la función.

Parents

Lista de funciones que llaman a la función perfilada, incluyendo el número de veces que la función principal ha llamado a la función perfilada.

Haga clic en el nombre de una función de la lista para mostrar información detallada sobre la función.

Lines that take the most time

Lista de líneas de código en la función perfilada que ha utilizado la mayor cantidad de tiempo de procesamiento.

Haga clic en una línea de código para verla en la sección Function Listing, dentro del contexto del resto del código de la función.

Children

Lista de todas las funciones llamadas por la función perfilada.

Haga clic en el nombre de una función de la lista para mostrar información detallada sobre la función.

Code Analyzer results

Lista de problemas y mejoras potenciales para la función perfilada.

Coverage results

Estadísticas de cobertura de código sobre las líneas de código en la función que MATLAB ha ejecutado durante el perfilado.

Para realizar un análisis adicional de cobertura de código, consulte Collect Statement and Function Coverage Metrics for MATLAB Source Code.

Function listing

Código fuente de la función, si es un archivo de código de MATLAB.

Para cada línea de código, Function listing incluye estas columnas:

  • Tiempo de ejecución para cada línea de código

  • Número de veces que MATLAB ha ejecutado la línea de código

  • El número de línea.

    Haga clic en un número de línea en Function listing para abrir la función en el editor predeterminado.

  • El código fuente de la función. El color del texto indica lo siguiente:

    • Verde: líneas comentadas

    • Negro: líneas de código ejecutadas

    • Gris: líneas de código no ejecutadas

De forma predeterminada, Profiler resalta las líneas de código con el tiempo de ejecución más largo. Cuanto más oscuro sea el resaltado, más ha tardado en ejecutarse la línea de código. Para cambiar los criterios de resaltado, vaya a la pestaña Profiler y, en la sección View, haga clic en Highlight . Seleccione entre las opciones de resaltado disponibles. Por ejemplo, para resaltar líneas de código que no se han ejecutado, seleccione la opción Non coverage.

Guardar los resultados

Para comparar el impacto de los cambios después de haber realizado mejoras en el código, guarde los resultados del perfilado. Para guardar los resultados, utilice el enlace que aparece debajo de la gráfica de llamas para copiar los resultados que se muestran en una ventana separada.

Flame graph of the solvelotka function and the "Copy to new window for comparing multiple runs" link underneath it, circled in red

También puede imprimir los resultados desde Profiler yendo a la pestaña Profiler y haciendo clic en el botón Print.

Perfilar múltiples instrucciones en la ventana de comandos

Para perfilar más de una instrucción en la ventana de comandos:

  1. Vaya a la ventana de comandos y escriba profile on.

  2. Introduzca y ejecute las instrucciones que desee perfilar.

  3. Después de ejecutar todas las instrucciones, escriba profile off.

  4. Abra Profiler escribiendo profile viewer. También puede ir a la pestaña Apps y, en MATLAB, hacer clic en el icono de la app Profiler.

  5. Revise los resultados del resumen de perfilado.

Perfilar una app

Puede perfilar aplicaciones que cree en App Designer. También puede perfilar aplicaciones que se incluyen con los productos de MathWorks, como la herramienta Filter Design and Analysis incluida con Signal Processing Toolbox™.

Para perfilar una app:

  1. Abra Profiler yendo a la pestaña Apps y, en MATLAB, haciendo clic en el icono de la app Profiler. También puede escribir profile viewer en la ventana de comandos.

  2. En la sección Profile de la barra de herramientas de Profiler, haga clic en Start Profiling. Asegúrese de que no haya código en el cuadro de edición a la derecha del botón.

  3. Inicie la app.

  4. Utilice la app.

  5. Cuando haya terminado, haga clic en Stop Profiling en la barra de herramientas de Profiler.

  6. Revise los resultados del resumen de perfilado.

Nota

Para excluir el proceso de inicio de la app en el perfil, invierta los pasos 2 y 3. En otras palabras, inicie la app antes de hacer clic en Start Profiling.

Consulte también

Apps

Funciones

Temas