Optimizaciones guiadas por perfiles

La optimización guiada por perfiles (PGO) permite optimizar un archivo ejecutable completo. El optimizador usa datos de ejecuciones de prueba del archivo .exe o .dll. Los datos representan el rendimiento probable del programa en un entorno de producción.

Nota:

SPGO (optimización guiada por perfiles de muestra) es un enfoque alternativo que utiliza los contadores de rendimiento de Windows de la CPU basados en hardware en lugar de la instrumentación. SPGO no requiere ninguna compilación instrumentada; puede perfilar un binario de lanzamiento existente mediante xperf. Para obtener más información, consulte el tutorial de ejemplo de optimización guiada por perfiles (SPGO).

Las optimizaciones guiadas por perfiles solo están disponibles para destinos nativos x86, x64 o ARM64. Las optimizaciones guiadas por perfil no están disponibles para archivos ejecutables que se ejecutan en el Common Language Runtime. Aunque produzca un ensamblaje con código nativo y administrado mixto (usando la opción del compilador /clr), no se puede usar la optimización guiada por perfiles solo en el código nativo. Si intenta compilar un proyecto con estas opciones establecidas en el IDE, se producirá un error de compilación.

Nota:

La información recopilada de las ejecuciones de pruebas de generación de perfiles invalida las optimizaciones que, de lo contrario, estarían en vigor si especifica /Ob, /Os o /Ot. Para obtener más información, consulte /Ob (Expansión de funciones insertadas) y /Os, /Ot (Favorecer código pequeño, favorecer código rápido).

Pasos para optimizar la aplicación

Para usar la optimización guiada por perfiles, siga estos pasos para optimizar la aplicación:

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

    El compilador examina cada módulo creado con /GL durante las ejecuciones de pruebas de optimización guiadas por perfiles para capturar el comportamiento en tiempo de ejecución. No es necesario compilar todos los módulos en una compilación de optimización guiada por perfiles con /GL. Sin embargo, solo los módulos compilados con /GL se instrumentan y más adelante están disponibles para las optimizaciones guiadas por perfiles.

  • Vínculo mediante /LTCG y /GENPROFILE o /FASTGENPROFILE.

    Cuando se usa /LTCG y /GENPROFILE o /FASTGENPROFILE, la aplicación instrumentada crea un .pgd archivo cuando se ejecuta. Después de agregar datos de ejecución de pruebas al .pgd archivo, puede usarlo como entrada en el paso de vínculo siguiente (creando la imagen optimizada). Al especificar /GENPROFILE, puede agregar opcionalmente un argumento PGD=filename para especificar un nombre o ubicación no predeterminado para el .pgd archivo. La combinación de las opciones /LTCG y /GENPROFILE o /FASTGENPROFILE del enlazador reemplaza a la opción /LTCG:PGINSTRUMENT en desuso del enlazador.

  • Perfilar la aplicación.

    Cada vez que finaliza una sesión EXE con perfiles o se descarga un archivo DLL con perfiles, el proceso crea un appname!N.pgc archivo. Un archivo .pgc contiene información sobre una determinada serie de pruebas de la aplicación. appname es el nombre de la aplicación y N es un número a partir de 1. Se incrementa en función del número de otros appname!N.pgc archivos del directorio. Puede eliminar un archivo .pgc si la serie de pruebas no representa un escenario que quiere optimizar.

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

    La aplicación también puede invocar directamente una función PGO, PgoAutoSweep, para capturar los datos de perfil en el momento de la llamada como un archivo .pgc. Puede proporcionar un control más preciso sobre el código incluido en los datos capturados en sus archivos .pgc. Para obtener un ejemplo de cómo usar esta función, consulte la documentación de PgoAutoSweep.

    Al crear la compilación instrumentada, por defecto, la recopilación de datos se realiza en modo no seguro para hilos, que es más rápido pero puede ser impreciso. Al usar el argumento EXACT para /GENPROFILE o /FASTGENPROFILE, puede especificar la recopilación de datos en modo seguro para subprocesos, que es más preciso, pero más lento. Esta opción también está disponible si estableces la variable de entorno PogoSafeMode en desuso, o la opción del enlazador /POGOSAFEMODE en desuso, al crear la compilación instrumentada.

  • Vincular mediante /LTCG y /USEPROFILE.

    Use las opciones /LTCG y /USEPROFILE del enlazador para crear la imagen optimizada. Este paso toma el .pgd archivo como entrada. Al especificar /USEPROFILE, puede agregar opcionalmente un argumento PGD=filename para especificar un nombre o ubicación no predeterminado para el .pgd archivo. También puede especificar este nombre utilizando la opción del enlazador /PGD, que está en desuso. La combinación de opciones del enlazador /LTCG y /USEPROFILE reemplaza las opciones del enlazador /LTCG:PGOPTIMIZE y /LTCG:PGUPDATE en desuso.

Incluso es posible crear el archivo ejecutable optimizado y más adelante determinar que más generación de perfiles sería útil para crear una imagen más optimizada. Si la imagen instrumentada y su .pgd archivo están disponibles, puede realizar más ejecuciones de prueba y recompilar la imagen optimizada con el archivo más reciente .pgd mediante las mismas opciones del enlazador /LTCG y /USEPROFILE .

Nota:

Los archivos .pgc y .pgd son de tipo binario. Si los almacena en un sistema de control de código fuente, evite cualquier transformación automática que se pueda realizar en archivos de texto.

Optimizaciones realizadas mediante PGO

Las optimizaciones guiadas por perfiles incluyen estas comprobaciones y mejoras:

  • Integración - Por ejemplo, si la función A llama con frecuencia a la función B y la función B es relativamente pequeña, las optimizaciones guiadas por perfiles integran la función B en la función A.

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

  • Asignación de registros: la optimización basada en datos de perfil produce una 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 (localidad) los bloques básicos que se ejecutan frecuentemente dentro de un marco determinado. Esto minimiza el número de páginas usadas y, por tanto, la sobrecarga de memoria.

  • Optimización del tamaño y la velocidad: se puede optimizar la velocidad de las funciones en las que el programa invierte más tiempo de ejecución.

  • Diseño de las funciones: según el gráfico de llamadas y 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 ramas condicionales: con los sondeos de valor, las optimizaciones guiadas por perfiles pueden averiguar si un valor determinado en una instrucción "switch" se usa con más frecuencia que otros valores. En ese caso, el valor se puede extraer de la sentencia switch. La misma optimización se puede realizar con instrucciones if...else, en las que el optimizador puede ordenar if...else para que el bloque if o el bloque else se coloque primero, dependiendo de cuál de los dos se cumpla con mayor frecuencia.

  • Separación de código muerto - La optimización guiada por perfiles mueve el código que no se ejecuta durante la recopilación de perfiles a una sección especial al final del conjunto de secciones. Mantiene esta sección fuera de las páginas usadas con frecuencia de manera eficaz.

  • Separación de código EH: dado que el código EH solo se ejecuta de forma excepcional, a menudo se puede mover a una sección independiente. Las optimizaciones guiadas por perfiles la mueven cuando determinan que las excepciones solo se producen en condiciones excepcionales.

  • Intrínsecos de memoria - Que se expanda o no un intrínseco depende de si se invoca con frecuencia. Una función intrínseca también se puede optimizar basándose en el tamaño de bloque de los movimientos o copias.

Pasos siguientes

Para obtener más información sobre estas variables de entorno, funciones y herramientas que puede usar en optimizaciones guiadas por perfiles, consulte los siguientes recursos:

Variables de entorno para las optimizaciones guiadas por perfiles
Estas variables especifican el comportamiento en tiempo de ejecución de los escenarios de prueba. Las nuevas opciones del enlazador las han reemplazado y ahora están en desuso. En este documento se muestra cómo pasar de las variables de entorno a las opciones del enlazador.

PgoAutoSweep
Una función que se puede agregar a la aplicación para proporcionar un control detallado de captura de datos del archivo .pgc.

pgosweep
Una utilidad de línea de comandos que escribe todos los datos de perfil en el archivo .pgc, cierra el archivo .pgc y abre un nuevo archivo .pgc.

pgomgr
Una utilidad de línea de comandos que agrega los datos de perfil de uno o más archivos .pgc al archivo .pgd.

Cómo: Combinar varios perfiles de PGO en un único perfil
Ejemplos de uso de pgomgr.

Tutorial de ejemplo sobre optimización guiada por perfiles (SPGO)
Use contadores de rendimiento de hardware de CPU en lugar de instrumentación. No se requiere ninguna compilación instrumentada; analice el rendimiento de su binario de producción existente con xperf.

Consulte también

Herramientas de generación MSVC adicionales