前几天汇编老师给我们这样两段代码让我们去测试运行速度
/* 程序1 */
static volatile int array[4096][4096];
int main()
{
int x, y;
for(y = 0; y != 4096; y++)
for(x = 0; x != 4096; x++)
array[x][y] = 0;
return array[x - 1][y - 1];
}
/* 程序2 */
static volatile int array[4096][4096];
int main()
{
int x, y;
for(x = 0; x != 4096; x++)
for(y = 0; y != 4096; y++)
array[x][y] = 0;
return array[x - 1][y - 1];
}
这两个程序的内层循环次数完全一样,而且都是相同的赋值语句。原本自己估计两个程序运行时间应该大致相同,程序2由于是对连续内存区进行访问,在经过编译器优化后可能速度略有提升。但实际测了一下,发下在gcc -O0和gcc -O3下程序2都比程序1节省了大约8倍时间?!
后来查了一下才知道,原来CPU在操作内存时会优先在CPU缓存中进行。程序2由于是对连续的内存进行操作,所以更新缓存的次数少;而程序1需要不停地更新缓存中的内容,所以花费了大量时间。
看来以后写程序还是要注意,太过于依赖-O3还是不行,有些细节还是要自己把握。