Por que a adição elemento a elemento em dois loops separados é muito mais rápida do que em um único loop combinado?
Olá, colegas! Escrevo em C++ há vários anos, mas recentemente me deparei com um comportamento de desempenho muito estranho que não consigo explicar.
Tenho dois arrays: `a` e `b` com 20 milhões de elementos cada. Quero primeiro somá-los elemento a elemento e escrever o resultado no array `c`, depois somar os elementos do array `c` com o array `d` e escrever no array `e`. Escrevi duas variantes de código: a primeira com dois loops separados, a segunda com um único loop combinado.
Aqui está o código:
```cpp
#include
#include
#include
const size_t N = 20000000;
int main() {
std::vector a(N, 1);
std::vector b(N, 2);
std::vector c(N);
std::vector d(N, 3);
std::vector e(N);
// Variante 1: dois loops separados
auto start1 = std::chrono::high_resolution_clock::now();
for (size_t i = 0; i < N; ++i) {
c[i] = a[i] + b[i];
}
for (size_t i = 0; i < N; ++i) {
e[i] = c[i] + d[i];
}
}