C ++代码执行时间取决于代码结构

时间:2018-10-20 12:50:55

标签: c++

我遇到了this个很棒的youtube教程,在其中一张幻灯片中,我看到了一些我不了解的内容。为什么会这样呢?这个编译器有关系吗?

版本1看起来像这样:

const int N = 5000;
float a [N*N];

for (int x=0; x<n; ++x)
     for(int y=0; y<N; ++y)
          sum+=a[x+y*N];

大约需要239.4毫秒才能执行。

版本2看起来像这样:

const int N = 5000;
float a [N*N];

for (int y=0; y<n; ++y)
     for(int x=0; x<N; ++x)
          sum+=a[x+y*N];

大约需要79.5毫秒来执行。 为什么会这样?

1 个答案:

答案 0 :(得分:5)

第二个示例展示了更好的数据局部性,因为它访问同一行中的元素。基本上,它执行顺序的内存读取,而第一个示例在每次迭代时都跳过sizeof(float) * N个字节,这给CPU缓存/内存带来了更多压力。