程序局部性原理


存儲器系統是一個具備不同容量、成本和訪問時間的存儲設備。其訪問速度由快到慢,依次為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!\n",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,說明函數局部性好的代碼執行效率高。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM