LINUX.ORG.RU

История изменений

Исправление cumvillain, (текущая версия) :

Ладно, кроме шуток, ленин-то прав. Оптимизатор сведет оба кода к одному и тому же ассемблеру. Чтобы не сводил, тебе надо пометить array как volatile и вот тогда начинаются приключения:

$ cat fast.c
#include <stdlib.h>

#define N 16384
#define M 16384

int
main(void)
{
	volatile static int array[N][M];

	for(int i = 0; i < N; i++)
		for(int j = 0; j < M; j++)
			array[i][j] = rand();
	return 0;
}
$ cat slow.c
#include <stdlib.h>

#define N 16384
#define M 16384

int
main(void)
{
	volatile static int array[N][M];

	for(int j = 0; j < M; j++)
		for(int i = 0; i < N; i++)
			array[i][j] = rand();
	return 0;
}
$ gcc -O2 -o fast fast.c
$ gcc -O2 -o slow slow.c
$ time ./fast
./fast  2.96s user 0.15s system 99% cpu 3.111 total
$ time ./slow
./slow  4.38s user 0.17s system 99% cpu 4.555 total

Исправление cumvillain, :

Ладно, кроме шуток, ленин-то прав. Оптимизатор сведет оба кода к одному и тому же ассемблеру. Чтобы не сводил, тебе надо пометить array как volatile и вот тогда начинаются приключения.

Исправление cumvillain, :

Ладно, кроме шуток, ленин-то прав. Оптимизатор сведет оба кода к одному и тому же ассемблеру.

Исправление cumvillain, :

Ладно, кроме шуток, ленин-то прав. Оптимизатор сведет оба кода к одному и тому же ассемблеру. Помимо того что в исходом коде опечатка во втором примере ([i][j] вместо [j][i]).

Исправление cumvillain, :

Ладно, кроме шуток, ленин-то прав. Оптимизатор сведет оба кода к одному и тому же ассемблеру. Помимо того что в исходом коде опечатка во втором примере.

Исходная версия cumvillain, :

Ладно, кроме шуток, ленин-то прав. Оптимизатор сведет оба кода к одному и тому же ассемблеру.