Esta pregunta es idéntica a esta Two loop bodies or one (result identical) pero en mi caso, uso Java.Dos operaciones en un bucle frente a dos bucles realizando las mismas operaciones una por bucle
Tengo dos circuitos que se ejecutan mil millones de veces.
int a = 188, b = 144, aMax = 0, bMax = 0;
for (int i = 0; i < 1000000000; i++) {
int t = a^i;
if (t > aMax)
aMax = t;
}
for (int i = 0; i < 1000000000; i++) {
int t = b^i;
if (t > bMax)
bMax = t;
}
El tiempo que lleva ejecutar estos dos bucles en mi máquina es de aproximadamente 4 segundos. Cuando fusiono estos dos bucles en un solo bucle y realizo todas las operaciones en ese solo bucle, se ejecuta en 2 segundos. Como puede ver, las operaciones triviales conforman el contenido del ciclo, lo que requiere un tiempo constante.
Mi pregunta es dónde obtengo esta mejora en el rendimiento?
Supongo que el único lugar posible donde el rendimiento se ve afectado en los dos bucles separados es que aumenta i y comprueba si i < 1000000000 2 mil millones frente a solo mil millones de veces si fusiono los bucles. ¿Está sucediendo algo más allí?
Gracias!
quiero suponer que es porque estás haciendo 1B incrementos más, 1B comparaciones más y 1B saltos más ... – verdesmarald
¿Cuál es el efecto de mover la declaración 'int t;' fuera de los bucles y simplemente hacer la asignación 't = a^i;' o 't = b^i;' dentro de los bucles (s)? – barrowc
@barrowc no tendría ningún efecto en absoluto. Una de las primeras fases en el JIT es convertir el gráfico AST en una representación de asignación única, lo que desharía este alias por el bien de un mejor análisis de vida útil. – ddimitrov