Chinaunix首页 | 论坛 | 博客
  • 博客访问: 306274
  • 博文数量: 33
  • 博客积分: 132
  • 博客等级: 入伍新兵
  • 技术积分: 1002
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-16 22:24
个人简介

学习计算机科学与技术专业,喜欢计算机,喜欢linux,喜欢编程

文章存档

2014年(7)

2013年(12)

2012年(14)

分类:

2012-11-15 17:47:55

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

 

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