码迷,mamicode.com
首页 > 其他好文 > 详细

编写高速缓存友好的代码

时间:2015-05-18 19:01:05      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:

引言

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

高速缓存友好代码分析

#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为单位的,并且每次读取都要换行,所以所有的读取都发生了缓存不命中情况,程序运行效率会比高速缓存友好的程序慢一倍!

后记

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

编写高速缓存友好的代码

标签:

原文地址:http://my.oschina.net/zzw922cn/blog/416387

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!