Avatar ·

¿Por qué la suma elemento por elemento en dos bucles separados es más rápida que en un solo bucle combinado?

¡Hola a todos! Llevo un par de meses programando en C++ y me encontré con un comportamiento de rendimiento muy extraño. Tengo dos arrays: `a` y `b` de tamaño 200000000 elementos (aproximadamente 800 MB cada uno). Quiero sumarlos elemento por elemento y guardar el resultado en el array `c`, luego multiplicar cada elemento de `c` por 2 y guardarlo en `d`. Escribí dos variantes de código: **Variante 1 (dos bucles separados):** ```cpp for (int i = 0; i < n; ++i) { c[i] = a[i] + b[i]; } for (int i = 0; i < n; ++i) { d[i] = c[i] * 2; } ``` **Variante 2 (un solo bucle combinado):** ```cpp for (int i = 0; i < n; ++i) { c[i] = a[i] + b[i]; d[i] = c[i] * 2; } ``` Esperaba que la segunda variante fuera más rápida, ya que hace todo en un solo paso. Pero en la práctica (compilador MSVC, flags /O2, arquitectura x64) la primera variante funciona **casi el doble de rápido**. ¿Por qué? En la segunda variante hay menos operaciones con índices y menos comprobaciones de límites. Por favor, expliquen qué está pasando bajo el capó. ¿Está relacionado con...