C言語: 配列のサイズによって、最適なアルゴリズムが変化する例

というのを試してみた。パラメータは、環境によって異なると思われる。
-DT1をつけてコンパイルすると配列サイズが100x100になり、つけなければ400x400になる。(比較しやすいように適当にスケールを調整している)

$ gcc -DT1 -O3 test.c

$ ./a.exe 
1: 5507
2: 3865

$ gcc -O3 test.c

$ ./a.exe 
1: 2072
2: 4726

以下、ソースコード

#ifdef T1
#define N 100
#define C 300

#else
#define N 400
#define C 1

#endif

#include <stdio.h>
#include <stdlib.h>
#include <sys/times.h>

typedef void (*myfunc)(double[N][N], double[N][N], double[N][N]);

double x[N][N], y[N][N], z[N][N];
struct tms t;

void test (int n, myfunc f)
{
  int i,j,k;
  time_t t0, t1;
  for (i=0; i<N; ++i)
    for (j=0; j<N; ++j){
      x[i][j] = 0.0;
	  y[i][j] = i;
	  z[i][j] = j;
    }

  t0 = times(&t);
  for (k=0; k<C; ++k)
    f(x,y,z);
  t1 = times(&t);
  printf("%d: %ld\n", n, t1 - t0);
}

void f1 (double x[N][N], double y[N][N], double z[N][N])
{
  int i,j,k;
  for (i=0; i<N; ++i)
    for (j=0; j<N; ++j)
      for (k=0; k<N; ++k)
        x[i][j] = x[i][j] + y[i][k] * z[k][j];
}

void f2 (double x[N][N], double y[N][N], double z[N][N])
{
  int i,j,k;
  for (k=0; k<N; ++k)
    for (j=0; j<N; ++j)
      for (i=0; i<N; ++i)
        x[i][j] = x[i][j] + y[i][k] * z[k][j];
}

int main (int argc, char **argv)
{
  test(1, f1);
  test(2, f2);
}