为什么相同的数组代码的执行时间之间存在差异



如果我运行以下程序,然后在 sum+=arr[i][j] 中交换 i 和 j 后再次运行它,则执行时间非常不同,即 9.8 秒与交换前的 2.7 秒相比。我只是不明白为什么会这样。有人可以告诉我为什么会这样吗?

#include<iostream>
#include<time.h>
using namespace std;
int main()
{
    int long sum=0;
    int size = 1024;
    clock_t start, end;
    double msecs;
    start = clock();
    int **arr = new int*[size];
    for (int i = 0; i < size; i++) 
    {
        arr[i] = new int[size];
    }
    for(int kk=0; kk<1000; kk++) 
    {
        sum = 0;
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size ; j++)
            {
                sum += arr[i][j];
            }
        }
    }
    end = clock();  
    msecs = ((double) (end - start)) * 1000 / CLOCKS_PER_SEC;
    cout<<msecs<<endl<<endl;
    return 0;
}
这是

由于空间局部性。当程序需要内存中的一些数据时,处理器不仅会读取该特定数据,还会读取相邻数据。因此,在下一次迭代中,当您需要下一组数据时,它已经存在于缓存中。

在另一种情况下,程序无法利用空间局部性,因为您不会在连续迭代中读取相邻数据。

假设您的数据在内存中布局,如下所示:

  0  1  2  3  4  5  6  7  8  9 
 10 11 12 13 14 15 16 17 18 19
 20 21 22 23 24 25 26 27 28 29

当你的程序需要读取标记为 0 的数据时,它会读取整行:
0 1 2 3 4 5 6 7 8 9

因此,当您需要标记为 1 的数据时,它已经在缓存中,并且您的程序运行得更快。

相反,如果您正在按列读取数据,这对您没有帮助,每次您遇到缓存未命中并且处理器再次必须进行内存读取时。

简而言之,内存读取成本很高,这是处理器优化读取以节省时间的方式。

相关内容

  • 没有找到相关文章

最新更新