#include <stdio.h>
#include <time.h>
#define N 32768
char a[N][N];
char b[N][N];
int main() {
int i, j;
printf("address of a[%d][%d] = %p\n", N, N, &a[N][N]);
printf("address of b[%5d][%5d] = %p\n", 0, 0, &b[0][0]);
clock_t start = clock();
for (j = 0; j < N; j++)
for (i = 0; i < N; i++)
a[i][j] = b[i][j];
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;
printf("time taken: %f secs\n", seconds);
start = clock();
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
a[i][j] = b[i][j];
end = clock();
seconds = (float)(end - start) / CLOCKS_PER_SEC;
printf("time taken: %f secs\n", seconds);
return 0;
}
Вывод:
address of a[32768][32768] = 0x80609080
address of b[ 0][ 0] = 0x601080
time taken: 18.063229 secs
time taken: 3.079248 secs
Почему копирование столбцов по столбцам занимает почти в 6 раз больше, чем копирование по строке? Я понимаю, что 2D-массив в основном представляет собой массив размера nxn, где A [i] [j] = A [i * n + j], но с использованием простой алгебры я вычислил, что головка машины Тьюринга (в основной памяти) расстояние в обоих случаях. Здесь nxn - размер массива, а x - расстояние между последним элементом первого массива и первым элементом второго массива.