代码局部性对程序运行速度的影响

        对编程一直有很多疑问,很多时候甚至不知道如何描述这些疑问,但我知道自己可以从哪里可以找到自己的疑问和答案,答案是计算机系统,但感情上总觉得太难,没信心。编程语言、操作系统和计算机系统结构是三门课,一直分开来学,操作系统和计算机系统两门课尚算有所交织,而编程语言的课程似乎总是和这两门课程没有重叠之处。但恰恰编程又是建立在那两门课程之上的,三门课若能同时交互地学习效果肯定不错。

      仅就计算机系统中对程序局部性的考虑而做的内存和缓存之间的调度设计来看,写代码时也应该利用这一设计。下面是利用数组顺序存储的特点展现代码局部性对程序运行速度的影响:

良好的空间局部性代码:根据数组在内存空间的存储顺序依次取数。

#include <stdio.h>
#include <time.h>

int main()
{
    long int arr[1000][1000]={1};
    int i,j;
    long sum=0;
    int u;
    clock_t start,end;
    start=clock();
    for(u=0;u<1000;u++)//受系统分配内存的限制,数组不能太高维,于是用循环多次来使得执行时间更长。
    {
        for(i=0;i<1000;i++)//先读行后读列
        {
            for(j=0;j<1000;j++)
            {
                sum+=arr[i][j];
            }
        }
    }
    end=clock();
    double dur=(end-start)/CLOCKS_PER_SEC;
    printf("time:%f\n",dur);
}
运行时间为:1s.

不好的空间局部性代码:。

#include <stdio.h>
#include <time.h>

int main()
{
    long int arr[1000][1000]={1};
    int i,j;
    long sum=0;
    int u;
    clock_t start,end;
    start=clock();
    for(u=0;u<1000;u++)//受系统分配内存的限制,数组不能太高维,于是用循环多次来使得执行时间更长。
    {
        for(j=0;j<1000;j++)//先读列后读行
        {
            for(i=0;i<1000;i++)
            {
                sum+=arr[i][j];
            }
        }
    }
    end=clock();
    double dur=(end-start)/CLOCKS_PER_SEC;
    printf("time:%f\n",dur);
}
运行时间为:6s.


以前写代码从没考虑过这个问题,也似乎没遇到过这个问题,但如果处理的数据量大,频繁在外存、内存、缓存间调度,又注重效率的话就不得不考虑代码的局部性了。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值