首页 > 代码库 > 程序局部性原理
程序局部性原理
存储器系统是一个具备不同容量、成本和访问时间的存储设备。其访问速度由快到慢,依次为CPU急促请你,告诉缓冲存储器(SRAM),主存储器(DRAM),磁盘,通过网络连接的其他存储设备。
每次CPU和主存之间的数据传送都是通过一系列步骤完成的,局部性通常由两种形式,时间局部性和空间局部性。时间局部性指的是:被引用过一次的存储器位置在未来会被多次引用(通常在循环中)
空间局部性指的是:如果一个存储器的位置被引用,那么将来他附件的位置也会被引用。
以下面一个例子来说明:这是一个二维数组的求和。
可以看出,在for循环中,是以行序为主序列对元素进行遍历的,也就是说,先访问第一行的元素,再访问第二行元素。图b是二维数组的实际存储情况,可以看出,在存储器中,也是按照行序为主序进行存储的。在对向量的访问中,如果访问的数序和存储顺序一致,并且是连续访问,那么这种访问具有良好的空间局部性。
实际例子说明:
#include <stdio.h>#include <time.h>typedef int (*pFuncb)(int ,int);#define A_NUM 10000000#define B_NUM 1000int A[A_NUM] = {0};int B[B_NUM] = {0};void t1(int a,int b){ int i,j; for(i = 0; i < A_NUM ; i++) for(j = 0; j < B_NUM ;j++) B[j]++;}void t2(int a,int b) //t2 花费的时间应该小于t1{ int i,j; for(i = 0; i < B_NUM ; i++) for(j = 0; j < A_NUM ;j++) A[j]++;}void Show_Run_Time(pFuncb test_func,void *prompt){ clock_t start,end; start = clock(); test_func(1,1); end = clock(); printf(" %s %lf seconds is used!\n",prompt,((double)(end-start))/CLOCKS_PER_SEC);}int main(){ Show_Run_Time(t1,"t1 function"); Show_Run_Time(t2,"t2 function"); return 0;}
执行结果如下:
可以看出,t2函数执行的时间小于t1,说明函数局部性好的代码执行效率高。
程序局部性原理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。