zoukankan      html  css  js  c++  java
  • 程序局部性原理

    存储器系统是一个具备不同容量、成本和访问时间的存储设备。其访问速度由快到慢,依次为CPU急促请你,告诉缓冲存储器(SRAM),主存储器(DRAM),磁盘,通过网络连接的其他存储设备。

    每次CPU和主存之间的数据传送都是通过一系列步骤完成的,局部性通常由两种形式,时间局部性和空间局部性。时间局部性指的是:被引用过一次的存储器位置在未来会被多次引用(通常在循环中)

    空间局部性指的是:如果一个存储器的位置被引用,那么将来他附件的位置也会被引用。

    以下面一个例子来说明:这是一个二维数组的求和。

    可以看出,在for循环中,是以行序为主序列对元素进行遍历的,也就是说,先访问第一行的元素,再访问第二行元素。图b是二维数组的实际存储情况,可以看出,在存储器中,也是按照行序为主序进行存储的。在对向量的访问中,如果访问的数序和存储顺序一致,并且是连续访问,那么这种访问具有良好的空间局部性。

    实际例子说明:

    #include <stdio.h>
    #include <time.h>
    
    typedef int (*pFuncb)(int ,int);
    
    #define A_NUM 10000000
    #define B_NUM 1000
    int 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!
    ",prompt,((double)(end-start))/CLOCKS_PER_SEC);
    }
    
    int main()
    {
        Show_Run_Time(t1,"t1 function");
        Show_Run_Time(t2,"t2 function");
    
        return 0;
    }

    执行结果如下:

    image

    可以看出,t2函数执行的时间小于t1,说明函数局部性好的代码执行效率高。

  • 相关阅读:
    python基础篇 08 文件操作
    python基础篇 07set集合 深浅拷贝
    python 基础篇 06 编码 以及小知识点补充
    python基础篇 05字典
    钉钉中设置代码提交提醒--Github机器人(转)
    Spring Boot 之FilterRegistrationBean --支持web Filter 排序的使用(转)
    Spring Aop实例@Aspect、@Before、@AfterReturning@Around 注解方式配置(转)
    为什么添加了@Aspect 还要加@Component(转)
    Servlet 服务器 HTTP 响应
    Servlet 客户端 HTTP 请求
  • 原文地址:https://www.cnblogs.com/cherishui/p/4038346.html
Copyright © 2011-2022 走看看