在教科书Computer Systems: a Programmer's Perspective
中,有一些令人印象深刻的基准来优化行主要顺序访问。
我创建了一个小程序来测试自己是否从行主要访问到列主要访问的简单更改会对我自己的机器产生巨大影响。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define N 30000
int a[N][N] = { 0 };
int main() {
srand(time(NULL));
int sum = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
a[i][j] = rand() % 99;
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sum += a[i][j];
}
}
}
平均而言,行主要顺序访问在我的系统上进行8.42s
(n=5
试验),而列主要顺序访问在我的系统上进行30.12s
(n=5
试验),这非常重要。
从表面上看,优化应该是一件非常简单的事情。
为什么现代编译器不优化这些场景?