Compartir a través de


Optimizaciones guiadas por perfiles

La optimización guiada por perfiles le permite optimizar un archivo de salida, donde el optimizador utiliza datos de las ejecuciones de prueba del archivo .exe o .dll. Los datos representan el funcionamiento probable del programa en un entorno de producción.

Las optimizaciones guiadas por perfiles sólo están disponibles para destinos nativos: x86, familia del procesador Itanium (IPF) o x64. Las optimizaciones guiadas por perfiles no están disponibles para archivos de salida que se vayan a ejecutar en Common Language Runtime. Aunque produzca un ensamblado con código nativo y código administrado combinados (compilar con /clr), no puede utilizar optimización guiada por perfiles sólo en el código nativo.

Nota

La información que se recopila a partir de la generación de perfiles de las ejecuciones de prueba reemplazará las optimizaciones que, en caso contrario, estarían activas si se especifica /Ob, /Os o /Ot. Para obtener más información, vea /Ob (Expansión de funciones inline) y /Os, /Ot (Favorecer código pequeño, favorecer código rápido).

A continuación, se ofrece una visión general del proceso de utilización de optimizaciones guiadas por perfiles:

  • Compile uno o varios archivos de código fuente con /GL.

    Cada módulo generado con /GL se puede examinar durante las ejecuciones de prueba de optimización guiada por perfiles para capturar el comportamiento en tiempo de ejecución. No todos los módulos de la compilación de una optimización guiada por perfiles se tienen que compilar con /GL. No obstante, solo se instrumentarán los módulos compilados con /GL, que posteriormente estarán disponibles para optimizaciones guiadas por perfiles.

  • Vincule con /LTCG:PGINSTRUMENT.

    /LTCG:PGINSTRUMENT crea un archivo .pgd vacío. Después de agregar los datos de la ejecución de prueba al archivo .pgd, se pueden utilizar como entrada para el siguiente paso del vínculo (creación de la imagen optimizada). Al especificar /LTCG:PGINSTRUMENT, también tiene la opción de especificar /PGD con un nombre o una ubicación no predeterminados para el archivo .pgd.

  • Genere perfiles de la aplicación.

    Cada vez que finaliza una sesión EXE con perfiles generados o se descarga un archivo DLL con perfiles generados, se crea un archivo appname!#.pgc. Un archivo .pgc contiene información sobre una determinada ejecución de prueba de la aplicación. # es un número a partir de 1, que se incrementa en función del número de otros archivos appname!#.pgc del directorio. Puede eliminar un archivo .pgc si la ejecución de prueba no representa un escenario que desea optimizar.

    Durante una ejecución de prueba, puede forzar el cierre del archivo .pgc abierto en ese momento y la creación de un nuevo archivo .pgc con la utilidad pgosweep (por ejemplo, cuando el final de un escenario de pruebas no coincide con el cierre de la aplicación).

    Puede usar la opción PogoSafeMode al generar el perfil de su aplicación. Esta opción permite especificar si desea generar el perfil de la aplicación de modo seguro o rápido. Para obtener más información sobre estos modos, vea PogoSafeMode.

  • Vincule con /LTCG:PGOPTIMIZE.

    /LTCG:PGOPTIMIZE crea la imagen optimizada. Este paso toma como entrada el archivo .pgd. Para obtener más información, vea /LTCG:PGOPTIMIZE.

Incluso es posible crear el archivo de salida optimizado y, posteriormente, determinar que la generación de perfiles adicionales sería útil para crear una imagen más optimizada. Si la imagen instrumentada y su archivo .pgd están disponibles, puede efectuar nuevas ejecuciones de prueba y volver a generar la imagen optimizada con el archivo .pgd más reciente.

A continuación, se ofrece una lista de las optimizaciones guiadas por perfiles:

  • Procesos en línea: Por ejemplo, si existe una función A que llama frecuentemente a la función B, y la función B es relativamente pequeña, las optimizaciones guiadas por perfiles pondrán la función B en línea con la función A.

  • Especulación de llamada virtual: Si una llamada virtual, u otra llamada a través de un puntero a función, se destina frecuentemente a una función determinada, una optimización guiada por perfiles puede insertar una llamada directa ejecutada condicionalmente a la función de destino frecuente, y la llamada directa se puede poner en línea.

  • Asignación de registros: Una optimización con datos de perfil produce la mejor asignación de registros.

  • Optimización básica de bloques: La optimización básica de bloques permite colocar en el mismo conjunto de páginas (zona) los bloques básicos ejecutados habitualmente que se ejecutan temporalmente en un marco determinado. Así se minimiza el número de páginas utilizado y, por tanto, la sobrecarga de la memoria.

  • Optimización de tamaño/velocidad: Las funciones para las que el programa necesita mucho tiempo se pueden optimizar en velocidad.

  • Distribución de funciones: Basándose en el gráfico de llamadas y en el comportamiento observado entre llamador y destinatario, las funciones que tienden a estar situadas a lo largo de la misma ruta de ejecución se colocan en la misma sección.

  • Optimización de bifurcaciones condicionales: Con las comprobaciones de valores, las optimizaciones guiadas por perfiles pueden averiguar si un valor determinado en una instrucción switch se utiliza con más frecuencia que otros valores. En tal caso, el valor se puede extraer de la instrucción switch. Lo mismo se puede hacer con las instrucciones if-else en las que el optimizador puede ordenar la instrucción if-else de modo que se coloque primero el bloque if o el else, dependiendo de cuál sea true con más frecuencia.

  • Separación de código muerto: El código al que no se llama durante la generación de perfiles se mueve a una sección especial que se anexa al final del conjunto de secciones. Así, esta sección se mantiene fuera de las páginas utilizadas con frecuencia de manera efectiva.

  • Separación de código EH: El código EH, que se ejecuta excepcionalmente, a menudo se puede mover a una sección aparte cuando las optimizaciones guiadas por perfiles pueden determinar que las excepciones sólo se producen bajo condiciones especiales.

  • Funciones intrínsecas de memoria: La expansión de funciones intrínsecas se puede decidir mejor si es posible determinar si se llama a una función intrínseca con frecuencia. Una función intrínseca también se puede optimizar basándose en el tamaño de bloque de movimientos o copias.

Para obtener más información, vea Tutorial: Utilizar optimizaciones guiadas por perfil.

En esta sección

Herramientas para la optimización basada en perfiles

Cómo: Combinar varios perfiles PGO en un solo perfil

Vea también

Referencia

Herramientas de compilación de C/C++