笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述csapp-局部性相关的知识,希望能为你提供帮助。
局部性分为两中:时间局部性和空间局部性。
在时间局部性中,如果一个内存的位置被引用了一次,那么在将来有可能会被多次引用。
在空间局部性中,如果一个内存位置被引用了一次,那么在将来有可能这个内存附近的内存位置会被引用。
局部性的意义:局部性允许引入一个成为高速缓存存储器的存储器来保存最近被引用的指令和数据项,提高主存的访问速度。
【csapp-局部性】接下来看个例子;
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很明显最差。
推荐阅读
- Android--多线程之Handler
- Spring boot 梳理 - SpringApplication
- Spring boot 梳理 - 在bean中使用命令行参数-自动装配ApplicationArguments
- 如何精准的找到社交类APP软件开发服务商
- Delphi使用逍遥安卓模拟器
- 用H5开发微信还是开发APP()
- 使用什么进行app开发
- ORM(Object Relational Mapping)
- springmvc中@RequestMapping的使用