【发布时间】:2010-02-12 12:22:17
【问题描述】:
让我们考虑两个几乎相同的代码:
第一个
for (int k=0;k<1000;k++)
{
for (int i=0;i<600;i++)
{
for (int j=0;j<600;j++)
{
tab[i][j] = i *j;
}
}
}
第二
for (int k=0;k<1000;k++)
{
for (int i=0;i<600;i++)
{
for (int j=0;j<600;j++)
{
tab[j][i] = i *j;
}
}
}
在第二个而不是 tab[i][j] 中,我们有 tab[j][i]。
第一个代码要快得多。
问题
为什么第一个代码要快得多?
我的直觉
是不是因为当程序试图访问一个单元格时,首先包含这个单元格的整个块被移动到缓存中,然后通过缓存访问它。由于内存中的数组由连续的单元格表示,因此在第一种情况下,在第一种情况下对内存的访问比在第二种情况下要少得多。
【问题讨论】: