#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;
}
wyjściowa:Dlaczego kopiowanie kolumny tablicy 2D według kolumny trwa dłużej niż wiersz po wierszu w C?
address of a[32768][32768] = 0x80609080
address of b[ 0][ 0] = 0x601080
time taken: 18.063229 secs
time taken: 3.079248 secs
Dlaczego kolumna przez kopiowanie kolumny wziąć prawie 6 razy tak długo, jak rząd przez kopiowanie wierszy? Rozumiem, że tablica 2D to w zasadzie tablica o rozmiarach nxn, gdzie A [i] [j] = A [i * n + j], ale przy użyciu prostej algebry, obliczyłem, że głowica maszyny Turinga (w pamięci głównej) musiałaby podróżować odległość w obu przypadkach: . Tutaj nxn jest rozmiarem tablicy, a x jest odległością między ostatnim elementem pierwszej tablicy a pierwszym elementem drugiej tablicy.
Dlaczego obliczasz czasy pracy na podstawie ruchów głową maszyny Turinga? W nowoczesnej pamięci RAM komputera nie ma ruchomej głowicy odczytu i zapisu. – user2357112
podstawowa pamięć bębna ... stare dobre czasy! – chqrlie