Рассмотрим два почти идентичных кода:
Первый
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;
}
}
}
Во втором вместо вкладки [i] [j] у нас есть вкладка [j] [i].
Первый код намного быстрее.
Вопрос
Почему первый код намного быстрее?
Моя интуиция
Это потому, что когда программа пытается получить доступ к ячейке, сначала весь блок, содержащий эту ячейку, перемещается в кеш, а затем к нему обращаются через кеш. Поскольку массив в памяти представлен последовательными ячейками, то в первом случае, а затем в первом случае доступ к памяти намного меньше, чем во втором.