码迷,mamicode.com
首页 > 移动开发 > 详细

csapp-局部性

时间:2018-12-31 13:47:53      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:数组   app   提高   src   多次   pre   htm   for   内存结构   

局部性分为两中:时间局部性和空间局部性。

在时间局部性中,如果一个内存的位置被引用了一次,那么在将来有可能会被多次引用。

在空间局部性中,如果一个内存位置被引用了一次,那么在将来有可能这个内存附近的内存位置会被引用。

局部性的意义:局部性允许引入一个成为高速缓存存储器的存储器来保存最近被引用的指令和数据项,提高主存的访问速度。

接下来看个例子;

int sumvec(int v[N]){
   int i=0,sum=0;
for(i=0;i<N;i++)
     sum+=v[i];
return sum;

}

在这段代码中,我们可以看到,sum每一次循环都会被引用,因此sum具有良好的时间局部性。sum是一个标量,没有空间局部性,因为sum永远只占一个空间。

数组V在内存中的分布为

技术分享图片

很明显,v是一个矢量,在内存中连续分布,因此它具有良好的空间局部性,所以我们可以肯定sumvec具有良好的局部性

sumvec这样顺序访问一个向量每个元素的函数,具有步长为1的引用模式,我们称步长为1的引用模式为顺序引用模式。

一个连续向量中,·每隔k个元素进行访问,成为步长为k的引用模式,很明显,步长越长,空间局部性就越差。

接下来看一个空间局部性不连续的例子

int sumarraycols(int a[M][N]){
    int i,j,sum=0;
for(int i=0;i<N;i++)
for(int j=0;j<M;j++){
   sum+=a[j][i];

}
return sum;

}

a为一个二维矩阵,上面这个函数是按照列的顺序来访问二维数组的。由二维数组的内存结构可以看出,步长M,所以这个函数的空间局部性并不好。

看到一篇博客,写得挺好的,https://www.cnblogs.com/glczero/p/4478274.html。这里把二维数组的行扫描,列扫描的时间做了比较。

习题6.7
将 sum+=a[k][i][j]变成
sum+=a[i][j][k]即可
习题6.9
clear1函数就是一个一个扫描,步长为1
clear2函数会在vel和acc数组中不断地跳跃
clear3很明显最差。

 

csapp-局部性

标签:数组   app   提高   src   多次   pre   htm   for   内存结构   

原文地址:https://www.cnblogs.com/illfuckingkyzb/p/10201854.html

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