- Proyecto de calendario de Adviento de 25 días sobre optimización de compiladores en C/C++
- Del 1 al 25 de diciembre se presenta cada día, mediante publicaciones de blog y videos, un caso de optimización
- Cada publicación aborda en detalle cuándo se aplica, la interpretación del ensamblador y los casos en que no se aplica
- Aunque está centrado en x86-64, también incluye algunos contenidos de arquitectura ARM de 64 y 32 bits
- Una serie con gran valor educativo para desarrolladores que quieren aprender cómo funciona un compilador
Resumen del proyecto Advent of Compiler Optimisations 2025
- Tras casi un año de preparación, el proyecto publica un nuevo caso de optimización de compilador cada día durante diciembre
- Del 1 al 25 de diciembre se publica una entrada de blog y un video diarios
- Cada contenido trata una optimización interesante que realiza el compilador, basada en código C o C++
- Cada optimización se explica en detalle, incluyendo condiciones de aplicación, interpretación del código ensamblador y los casos en que no se aplica
- No se limita a comparar código, sino que analiza el funcionamiento real del compilador
Alcance técnico
- Cubre una amplia gama de temas, desde trucos a nivel de arquitectura de bajo nivel hasta técnicas de optimización de alto nivel
- Principalmente trata x86-64, pero también incluye parte del contenido relacionado con ARM de 64 y 32 bits
- Está conformado como material práctico para aprender el funcionamiento interno del compilador y su proceso de generación de código
Cómo participar y ver el contenido
- Es posible seguir todas las publicaciones mediante la etiqueta AoCO2025 del blog
- Los videos se pueden ver en el canal de YouTube o en una lista de reproducción dedicada
Importancia del proyecto
- Proyecto personal a gran escala, finalizado tras casi un año de preparación, con el objetivo de explorar la sofisticación y eficiencia de los compiladores
- Un intento educativo para ayudar a los desarrolladores a comprender el funcionamiento real de la optimización del compilador y poder aprovecharlo al escribir código
- El autor busca compartir la satisfacción de aprender lo sorprendentes que pueden ser los compiladores
Presentación de Matt Godbolt
- Desarrollador de C++ que vive en Chicago y trabaja en Hudson River Trading
- Coanfitrión del podcast Two’s Complement
- Activo en Mastodon y Bluesky
- El contenido del blog se distribuye bajo la licencia Creative Commons BY-NC 3.0 Unported
1 comentarios
Opinión en Hacker News
Después de ver las optimizaciones de compilador de Matt, también vale la pena revisar la entrevista que hice con él
Lo que terminé creyendo es esto: trabaja en el nivel de abstracción con el que te sientas cómodo, pero también entiende la capa de abajo
Por ejemplo, si eres programador de C, deberías saber cómo interactúa el runtime de C con el sistema operativo. No hace falta conocer todos los detalles, pero sí tener una idea de por dónde empezar a mirar cuando aparece un problema
El artículo de ACM Queue que escribió Matt también es viejo, pero sigue siendo una introducción excelente para entender este tipo de conceptos de optimización
Por ejemplo, al trabajar con Java, entender la JVM me permitió optimizar mucho mejor el rendimiento de software médico. Y además, simplemente es divertido entender la capa de abajo
Aunque claramente es un experto en el dominio, me impresiona que no se lance de inmediato al complejo conjunto de instrucciones de x86, sino que explique todo paso a paso desde lo básico
Matt Godbolt es una verdadera joya de las comunidades de C y C++
Creo que Compiler Explorer y sus aportes han mejorado el mundo de muchísimos desarrolladores
Estoy viendo Advent of Computer Science Advent Calendars, Day 2
Me interesa mucho la técnica de amalgamación de código que usa SQLite
Según el equipo de SQLite, solo con eso ya consiguen una mejora de rendimiento de 5 a 10%. Ojalá Matt toque este tema durante la sesión
Referencia: wiki de Unity build
Aun así, como LTO puede ser lento en builds no incrementales, unity build sigue siendo útil en compilaciones puntuales
Llevo 25 años desarrollando software, pero todavía me pregunto si estoy usando los flags de compilador óptimos
En la mayoría de los casos,
-O2es suficiente. Cada vez que el compilador se actualiza, sus optimizaciones internas mejoran, así que casi nunca hace falta que el desarrollador ajuste todo manualmenteAdemás, agregar flags basados en un benchmark mal hecho es peligroso. Diferencias de rendimiento de 1 a 2% son comunes según el estado del sistema
Si cambia la estructura del código, también puede cambiar qué tan amigable es con la caché, y eso afectar el rendimiento. O sea, puede que no sea por el flag, sino por cómo quedó distribuido el código
Tengo muchas ganas de ver las publicaciones que faltan. Esta mañana estuve enseñándole a SBCL a optimizar los patrones
(+ base (* index scale))y(+ base (ash index n))en una sola instrucción LEA. Fue aplicar de inmediato lo aprendido en el Day 2Nunca hay demasiado contenido de Godbolt
Me gustaría que cubrieran la operación de dividir por constantes enteras. El capítulo correspondiente de Hacker’s Delight es realmente excelente, pero para el lector general puede sentirse un poco difícil
Es como un Advent of Code para fanáticos de compiladores
Me encanta el formato de una pequeña lección diaria de optimización para ir desarrollando intuición
Entender qué hace el compilador y por qué lo hace te vuelve mejor programador sin importar qué lenguaje uses