Optimización guiada por perfiles
Optimización guiada por perfiles ( PGO ): una técnica para optimizar un programa por un compilador, destinado a aumentar el rendimiento del programa. A diferencia de los métodos de optimización tradicionales que analizan solo los códigos fuente, PGO utiliza los resultados de las mediciones de las ejecuciones de prueba del programa que se está optimizando para generar un código más óptimo. Las ejecuciones de prueba revelan qué partes del programa se ejecutan con más frecuencia y cuáles con menos frecuencia. La ventaja de este enfoque es que el compilador no hace suposiciones al elegir un método de optimización, sino que utiliza estadísticas reales recopiladas durante la ejecución del programa. Debe tenerse en cuenta que las pruebas de funcionamiento del programa deben realizarse de acuerdo con el escenario más típico para que las estadísticas sean representativas, de lo contrario, el rendimiento del programa puede incluso deteriorarse.
Métodos de optimización
Entre las optimizaciones que pueden utilizar las estadísticas recopiladas con PGO [1] :
- Incrustación : por ejemplo, si la función A a menudo llama a la función B, y la función B es lo suficientemente pequeña, entonces la función B está en línea en A. Esto se hace en función de estadísticas reales de lanzamientos de programas.
- Especulación de llamada virtual : si una llamada virtual o una llamada a través de una función de puntero a menudo apunta a una función específica, entonces se puede reemplazar con una llamada condicionalmente directa (activada cuando se cumple la condición) a una función específica, y la función puede incluso estar integrado (en línea).
- Asignación de registros : optimización de la asignación de registros en función de los datos recopilados.
- Optimización básica de bloques : esta optimización permite colocar bloques de código denominados conjuntamente en una página de memoria común, lo que minimiza el uso de la página y la sobrecarga de memoria.
- Optimización de tamaño/velocidad : las funciones en las que el programa pasa una cantidad significativa de tiempo se pueden optimizar para la velocidad de ejecución.
- Diseño de funciones : según el gráfico de llamadas , las funciones que pertenecen a la misma cadena de ejecución se colocarán en la misma sección.
- Optimización de bifurcación condicional : optimización de bifurcaciones y expresiones de conmutación. Basado en ejecuciones de prueba, PGO lo ayuda a determinar qué condiciones en una declaración de cambio se ejecutan con más frecuencia que otras. Estos valores luego se pueden sacar de la declaración de cambio. Lo mismo se aplica a if/else: el compilador puede ordenar las ramas en función de saber cuál se llama con más frecuencia.
- Separación de código muerto : el código que no se llamó durante las ejecuciones de prueba se puede mover a una sección especial para evitar que entre en las páginas de memoria de uso frecuente.
- Separación de código EH : el código de manejo de excepciones que se ejecuta en casos excepcionales se puede mover a una sección separada si es posible determinar que las excepciones se desencadenan en condiciones definidas específicamente.
- Funciones intrínsecas de la memoria: las funciones de memoria, como memset, memcpy y otras, pueden integrarse u optimizarse para los tamaños de bloque más comunes.
Implementaciones
Las técnicas de optimización de PGO son implementadas, en particular, por compiladores:
Notas
- ↑ Optimizaciones guiadas por perfil . Consultado el 15 de febrero de 2012. Archivado desde el original el 22 de febrero de 2012. (indefinido)
- ↑ Manual del usuario del compilador de Clang: documentación de Clang 3.9 . clang.llvm.org. Consultado el 6 de mayo de 2016. Archivado desde el original el 15 de septiembre de 2011. (indefinido)