Какая версия более эффективна и почему? Кажется, что оба делают одни и те же вычисления. Единственное, о чем я могу думать, это то, что компилятор признает, что в (a) j
не изменяет значение и не требует его вычисления снова и снова. Любой вход будет отличным!У кого лучше доступ к памяти? (C++)
#define M /* some mildly large number */
double a[M*M], x[M], c[M];
int i, j;
(a) First version
for (j = 0; j < M; j++)
for (i = 0; i < M; i++)
c[j] += a[i+j*M]*x[i];
(b) Second version
for (i = 0; i < M; i++)
for (j = 0; j < M; j++)
c[j] += a[i+j*M]*x[i];
Узнайте, измерив его на целевом компьютере. –
@PaulR: Подлинный вопрос - могут ли современные компиляторы не определять это и менять преамбулы цикла? Видя, как семантика одинакова. –
@LightnessRacesinOrbit: да, некоторые компиляторы могут выполнять переупорядочение каналов, по крайней мере для некоторых простых случаев, таких как это. –