Predicción de saltos y bucles críticos
Ayude a la CPU a predecir saltos y escriba bucles que el compilador pueda optimizar.
Predicción de saltos y bucles críticos es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
El predictor de saltos
Las CPU modernas predicen la siguiente instrucción antes de que termine la anterior. Cuando la predicción es incorrecta, la segmentación se detiene, con un coste de 10-20 ciclos.
Saltos predecibles
Los saltos que casi siempre toman el mismo camino o siguen un patrón claro se predicen bien. Los saltos aleatorios son catastróficos.
Los datos ordenados ayudan
Iterar sobre datos ordenados con una condición suele ser más rápido que hacerlo sobre datos desordenados: el predictor aprende el patrón.
// Often much faster on sorted data
std::sort(v.begin(), v.end());
int sum = 0;
for (int x : v) {
if (x > 128) sum += x;
}Código sin saltos
Reemplace los saltos por operaciones aritméticas cuando sea posible. La CPU evalúa ambos caminos y selecciona uno sin realizar un salto.
// Branchy
int max(int a, int b) { return (a > b) ? a : b; }
// Branchless (often equivalent in machine code)
int max(int a, int b) { return a + (b - a) * (b > a); }std::max como mejor opción
Los compiladores modernos suelen generar código sin saltos automáticamente. Escriba código claro y deje trabajar al optimizador, pero inspeccione el código desensamblado en las rutas críticas.
Sugerencias likely y unlikely
C++20 añadió [[likely]] y [[unlikely]] para proporcionar una sugerencia al compilador.
if (error_condition) [[unlikely]] {
handle_error();
}Desenrollado de bucles
Hacer más trabajo en cada iteración reduce la frecuencia de los saltos. Los compiladores modernos desenrollan los bucles por su cuenta; utilice #pragma unroll solo cuando las mediciones demuestren que ayuda.
Evite mezclar cargas de trabajo en los bucles
Un bucle con dos casos que se alternan aleatoriamente impide una buena predicción. Divídalo en dos bucles, uno por caso, cuando sea posible.
// Slow: random switching
for (auto& x : v) {
if (x.type == A) process_A(x);
else process_B(x);
}
// Faster: partition first
std::partition(v.begin(), v.end(), [](auto& x) { return x.type == A; });
for (size_t i = 0; i < boundary; ++i) process_A(v[i]);
for (size_t i = boundary; i < v.size(); ++i) process_B(v[i]);Ponga en línea las funciones críticas
La sobrecarga de una llamada a función puede igualar a la del cuerpo de la función en bucles críticos. Las sugerencias inline ayudan; __attribute__((always_inline)) (GCC/Clang) es más estricto.
No confíe en la intuición
Los compiladores y las CPU son muy inteligentes. Mida antes de optimizar. La versión «obviamente» sin saltos puede ser más lenta que la versión con saltos una vez que el predictor ha aprendido el patrón.
SIMD para bucles amplios
La vectorización automática convierte un bucle en instrucciones SIMD cuando es posible. Utilice código limpio y tipos sencillos, y evite dependencias de datos entre iteraciones.
Optimización guiada por perfiles (PGO)
Compile, ejecute, recopile datos de perfil y vuelva a compilar con las sugerencias. Los compiladores utilizan los datos para predecir mejor qué saltos son críticos.
Comprobación rápida
¿Por qué ordenar los datos antes de un bucle de filtrado puede a veces acelerar la ejecución?
Resumen
Los saltos mal predichos cuestan ciclos. Mantenga los saltos predecibles (los datos ordenados ayudan), utilice las sugerencias likely/unlikely, divida las cargas de trabajo para mantener uniformes los bucles y confíe en que el compilador optimice, salvo que el perfilado demuestre lo contrario.
Preguntas frecuentes
¿La lección «Predicción de saltos y bucles críticos» es gratis?
Sí — el texto completo de «Predicción de saltos y bucles críticos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Predicción de saltos y bucles críticos»?
Ayude a la CPU a predecir saltos y escriba bucles que el compilador pueda optimizar. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Predicción de saltos y bucles críticos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Diseños de datos favorables a la caché
- Predicción de saltos y bucles críticos
- Perfilado con perf, VTune y sanitizers
- Microbenchmarking con Google Benchmark