Chinaunix首页 | 论坛 | 博客
  • 博客访问: 373107
  • 博文数量: 55
  • 博客积分: 1033
  • 博客等级: 少尉
  • 技术积分: 603
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-21 13:36
文章存档

2013年(4)

2012年(51)

分类: C/C++

2012-11-03 00:00:00

CPU缓存和程序运行速度

前几天汇编老师给我们这样两段代码让我们去测试运行速度

/* 程序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还是不行,有些细节还是要自己把握。

 

阅读(1598) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

Bean_lee2012-11-05 12:35:13

这个是局部性原理。