El perfilado guiado por optimización (PGO) es un proceso de compilación en dos fases que permite a los compiladores reconfigurar físicamente el código binario para mejorar el rendimiento en cargas de trabajo específicas. A diferencia de las optimizaciones estáticas, PGO utiliza datos de ejecución real para determinar qué partes del código son 'calientes' (frecuentes) y cuáles son 'frías' (raras), permitiendo al compilador tomar decisiones quirúrgicas sobre la estructura del binario final.
En la primera fase, el compilador instrumenta el código con contadores en cada arista del grafo de flujo de control. Durante la ejecución de una carga de trabajo de entrenamiento, estos contadores registran el número de veces que se toma cada rama o bucle. En la segunda fase, el compilador utiliza estos datos para aplicar transformaciones avanzadas: inlining de llamadas frecuentes, reordenamiento de ramas para minimizar las burbujas de pipeline, y división de funciones en partes calientes y frías. Esta última técnica es crucial, ya que permite que el código caliente ocupe más espacio en la caché de instrucciones (icache) y que el código frío, que rara vez se ejecuta, sea segregado en secciones separadas para no desperdiciar espacio de caché ni ocupar espacio en disco innecesariamente.
Además, PGO permite el reordenamiento global de funciones en el binario final, especialmente útil en binarios grandes como mysqld, donde la localidad de memoria entre funciones que se llaman mutuamente mejora significativamente el rendimiento. También optimiza llamadas indirectas mediante la promoción a llamadas directas cuando el destino es predecible. Este enfoque no requiere que los datos de entrenamiento sean idénticos a la producción, sino que la forma del flujo de control se parezca, lo que explica por qué técnicas de entrenamiento amplias, como las utilizadas por MTR, son efectivas para optimizar el rendimiento de bases de datos complejas.
