Optimización guiada por perfil en Go: qué es y cuánto mejora el rendimiento

Fuentes: Profile-guided optimization in Go

La optimización guiada por perfil, conocida como PGO, sustituye las conjeturas del compilador por datos medidos: se ejecuta el programa, se registra dónde consume tiempo y esa grabación se devuelve al compilador para una segunda compilación más afinada. Go incorpora PGO desde la versión 1.20 mediante el paquete runtime/pprof, que toma muestras de la pila de llamadas unas cien veces por segundo y produce un perfil estadístico del uso de CPU.

A partir de ese perfil, el compilador toma sobre todo dos decisiones: inline de las funciones calientes y desvirtualización de llamadas a interfaz cuyo tipo concreto se repite con frecuencia. Para comprobar su efecto en la práctica, el autor comparó la velocidad de análisis de tres documentos JSON —twitter.json (632 kB), canada.json (2,25 MB) y citm_catalog.json (1,73 MB)— con el paquete estándar encoding/json en builds con y sin PGO, entrenando cada perfil con un documento distinto.

Las mejoras obtenidas son modestas: el mejor caso es canada.json con +4,7 % y la mayoría de variaciones se mueven entre el 2 % y el 3 %. Entrenar con un documento suele ayudar a los demás, aunque sin garantías; entrenar con twitter.json mejoró los tres, pero el perfil de canada.json solo reportó ganancia clara sobre sí mismo. El autor concluye que una ganancia del 3 % resulta poco llamativa por sí sola, pero puede lograrse casi sin coste y con bajo riesgo de penalizar otras cargas de trabajo, porque las optimizaciones que Go aplica ya son conservadoras.