Abseil Performance Hints (Jeff Dean & Sanjay Ghemawat)
1. Resumen
Este documento organiza principios generales y técnicas concretas sobre ajuste de rendimiento de software que Google ha considerado importantes desde sus primeros años. Se enfoca en la optimización del rendimiento desde la perspectiva de un binario único, más que en sistemas distribuidos o ajuste de hardware para ML.
2. Contenido principal
Forma de pensar sobre el rendimiento (Thinking about performance)
- Malentendido sobre "la optimización prematura es la raíz de todos los males": este dicho significa ignorar el 97% de las eficiencias triviales, no dejar pasar también el 3% de oportunidades críticas.
- Importancia de las mejoras pequeñas: una mejora de velocidad de alrededor del 12% no es en absoluto algo menor desde el punto de vista de ingeniería, y es esencial para programas de alta calidad.
- Elecciones iniciales: el enfoque de "primero hagámoslo simple y luego optimizamos" a menudo termina en una degradación general del rendimiento (Flat Profile), lo que dificulta mejorar después. Si no perjudica demasiado la legibilidad ni la complejidad, conviene elegir desde el inicio una alternativa más rápida (por ejemplo,
absl::InlinedVectoren lugar destd::vector).
Estimación (Estimation)
- Intuición y cálculo: al escribir código, es importante tener una idea anticipada del impacto que tendrá en el rendimiento.
- Cálculos aproximados: antes de implementar, conviene estimar de forma aproximada el costo de recursos. (Ej.: referencia a caché L1 0.5ns, bloqueo de mutex 15ns, lectura de SSD 20µs, etc., para calcular el rendimiento esperado a partir del costo de operaciones básicas).
Medición (Measurement)
- Profiling: la medición efectiva es la herramienta más importante. Hay que usar
pprofoperfpara identificar los cuellos de botella reales. - Consejos: pruebe con binarios de producción con flags de optimización aplicados y escriba microbenchmarks para verificar el impacto de los cambios.
Cómo enfrentar un perfil plano (Flat Profile)
- Cuando no hay un cuello de botella claro: si el perfil de CPU sale plano, una estrategia válida es acumular pequeñas optimizaciones de 1% distribuidas por todo el sistema.
- Mejoras estructurales: debe considerarse reestructurar los bucles en la parte alta de la pila de llamadas o cambiar las estructuras de datos.
Ejemplos de técnicas concretas
- Mejora de algoritmos: reemplazar lógica de detección de ciclos o de interbloqueos por algoritmos más eficientes (por ejemplo, basados en ordenamiento topológico) para asegurar velocidad y escalabilidad.
- Optimización de la representación en memoria: comprimir (Compact) estructuras de datos de acceso frecuente o ajustar el layout de memoria (reordenamiento de campos, reducción de padding) para mejorar la eficiencia de caché y reducir el tráfico del bus de memoria.
1 comentarios
Guau..