编写高速缓存友好的代码

引言

    根据时间局部性和空间局部性原理,我们就能明白高速缓存存储器的工作原理,局部性比较好的程序往往具有更好的性能,即运行得更快。因此,遵从局部性原理,好的程序员应该确保编写出高速缓存友好的代码。

高速缓存友好代码分析

#include<stdio.h>
void main()
{
  int a[4]={1,2,3,4};
  int i;
  int sum=0;
  for(i=0;i<4;i++)
    sum+=a[i];
}

    该程序具有良好的时间局部性,因为i,sum均被重复使用多次;该程序也具有良好的空间局部性,因为依次读取数组a的4个元素,由于int类型占据4个字节,因此只要高速缓存块大小大于16个字节(intel i7的块大小为64Bytes,因此足够),它们就可以一起被读入高速缓存块中,而仅仅是a[0]发生了高速缓存不命中,因为它第一个被读取需要加载,而后面3个量均为高速缓存命中。

高速缓存不友好代码分析  

#include<stdio.h>
void main()
{
  int a[2][2]={{1,2},{3,4}};
  int i,j,sum=0;
  for(int j=0;j<2;j++) {
    for(int i=0;i<2;i++) {
      sum+=a[i][j];
    }
  }
}

    由于C语言是按行优先顺序来存储的,所以这个循环的步长不是以1为单位的,并且每次读取都要换行,所以所有的读取都发生了缓存不命中情况,程序运行效率会比高速缓存友好的程序慢一倍!

后记

    在平时的编程中,应该尽量避免编写局部性很差的程序,尝试编写高速缓存友好高质量的代码。

转载于:https://my.oschina.net/zzw922cn/blog/416387

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值