【发布时间】:2014-04-02 22:46:13
【问题描述】:
如果我运行以下程序,然后在 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;
}
【问题讨论】:
-
谷歌“缓存命中性能”(与您的问题无关,这是一个非常擅长表演的艺术团体)。
-
还有 Google 的“数据驱动开发”和“优化数组”
-
在本主题中要搜索的另一个非常重要的关键字是“prefetch”。 x86 和 x64 会自动执行此操作,在一些较笨的硬件上,您必须使用程序集或内部函数为自己手动进行预取。从 cpu 的角度来看,通过线性扫描 1-2 个内存区域的算法简单地优于使用看似“随机访问”策略的算法。这通常就是为什么经典链表很糟糕的原因,尤其是与基于向量的数据结构相比,没有自定义分配器的情况下,有时会根据您需要的操作在获胜者之间混合。
标签: c++ arrays time execution localityofreference