Старший порядок строк по сравнению с основным порядком столбцов.
Напомним сначала, что все многомерные массивы представлены в памяти как непрерывный блок памяти. Таким образом, многомерный массив A (m, n) может быть представлен в памяти как
a00 a01 a02 ... a0n a10 a11 a12 ... a1n a20 ... amn
В первом цикле вы последовательно проходите через этот блок памяти. Таким образом, вы пробегаете массив, пересекая элементы в следующем порядке
a00 a01 a02 ... a0n a10 a11 a12 ... a1n a20 ... amn
1 2 3 n n+1 n+2 n+3 ... 2n 2n+1 mn
Во втором цикле вы пропускаете память и пробегаете массив, пересекая элементы в следующем порядке
a00 a10 a20 ... am0 a01 a11 a21 ... am1 a02 ... amn
или, возможно, более ясно,
a00 a01 a02 ... a10 a11 a12 ... a20 ... amn
1 m+1 2m+1 2 m+2 2m+2 3 mn
Все эти пропуски действительно причиняют вам боль, потому что вы не получаете преимуществ от кэширования. Когда вы последовательно запускаете массив, соседние элементы загружаются в кеш. Когда вы пропускаете массив, вы не получаете этих преимуществ, а вместо этого продолжаете получать кеш, который снижает производительность.