¿Cómo determinan los compiladores de optimización modernos cuándo aplicar ciertas optimizaciones, como el despliegue de bucles y la alineación de códigos?¿Cómo determinan los optimizadores de compilación modernos cuándo optimizar?
Dado que ambos afectan al almacenamiento en caché, las funciones de alineación ingenuas con menos de X líneas, o cualquier otra heurística simple, es probable que generen un código de peor rendimiento. Entonces, ¿cómo lidian los compiladores modernos con esto?
Tengo dificultades para encontrar información sobre esto (especialmente información que es razonablemente fácil de entender ...), lo mejor que pude encontrar es el wikipedia article. ¡Cualquier detalle, enlaces a libros/artículos/documentos son muy apreciados!
EDIT: Dado que las respuestas hablan principalmente de las dos optimizaciones que mencioné (alineación y desenrollado de bucle), solo quería aclarar que estoy interesado en todas las optimizaciones del compilador, no solo en esas dos. También estoy más interesado en las optimizaciones que se pueden realizar durante la compilación anticipada, aunque la optimización JIT también es interesante (aunque en menor medida).
Gracias!
JIT no siempre tiene tiempo para algunas optimizaciones masivas, y los recorridos de codificación a veces varían enormemente en los datos, por lo que las optimizaciones guiadas por perfil no son siempre la ruta correcta. –