Tiempo empleado: fila sum principal columna sum importante

Me he encontrado con esta pregunta y estoy un poco confundido. Se han dado dos códigos y se pregunta cuál tomaría más tiempo o si ambos tomarán el mismo tiempo. Los códigos fueron:

void sumCal(int n,int a[][]){ int sum=0; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ sum=sum+a[i][j]; } } } 

o

 void sumCal(int n,int a[][]){ int sum=0; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ sum=sum+a[j][i]; } } } 

Por lo que sé, depende de la disposición de la memoria, si la memoria se distribuye en la fila principal o en la columna mayor. ¿Es esta la respuesta correcta?

Un problema principal es, de hecho, si la matriz se presenta en formato de fila mayor o columna principal. Eso está definido por el estándar C; No es algo que se deja a los escritores comstackdores. El otro problema principal es el tamaño de la matriz; si es lo suficientemente pequeño como para caber en la memoria caché, entonces no es crítico qué mecanismo usa, pero si es demasiado grande para caber en la memoria caché, entonces un mecanismo es mucho más rápido que el otro.

Cual es Bueno, una búsqueda rápida en Wikipedia para Row-major Order muestra que C usa row-major order.

No estoy realmente seguro de que el código se compile primero, porque la dimensión debe incluirse en la statement del parámetro de la función para las matrices de cada dimensión después de la primera.

De todos modos, C es la fila principal (lo que significa que los elementos dentro de las filas se almacenan de forma contigua en la memoria, y en realidad para una matriz multidimensional en C, la matriz completa es contigua), por lo que la primera opción podría ser más rápida, ya que el bucle interno atraviesa una fila por iteración sobre las columnas.

Finalmente, necesita saber qué tan grandes son las matrices y qué tan grande es el caché L1 en la CPU que está usando. Si la matriz puede caber dentro del caché L1, entonces ambas opciones deberían ejecutarse a la misma velocidad, ya que no se expulsarán líneas de caché antes de que se terminen de usar.