Im a relatively new coder and am still learning the best way to do thigs

- and I have always been told the best way to learn is by writing

testing code and measuring, Could anyone shed some light on why my

'MyArray[,,]' test is so much faster? Id really like to know!

What is the best met

Cheers Guys

Jon Rea

Application Output

WindowsXP:

Sum: 251437500.000000

Sum: 251437500.000000

Array3D test Took 30 seconds

Sum: 251437500.000000

Sum: 251437500.000000

MyArray[] test Took 30 seconds

Sum: 251437500.000000

Sum: 251437500.000000

MyArray[] (V2) test Took 29 seconds

Sum: 251437500.000000

Sum: 251437500.000000

MyArray[,,] test Took 11 seconds

Linux (RH9):

Sum: 251437500.000000

Sum: 251437500.000000

Array3D test Took 20 seconds

Sum: 251437500.000000

Sum: 251437500.000000

MyArray[] test Took 20 seconds

Sum: 251437500.000000

Sum: 251437500.000000

MyArray[] (V2) test Took 22 seconds

Sum: 251437500.000000

Sum: 251437500.000000

MyArray[,,] test Took 6 seconds

Application Code

#include <iostream>

#include <stdio.h>

#include <tchar.h>

#include <time.h>

#include "tntjama/tnt_array3d.h"

using namespace TNT;

int _tmain(int argc, _TCHAR* argv[])

{

int count1 = 15;

int count2 = 100;

int M = 150;

int N = 150;

int P = 150;

time_t starttime = time( NULL );

for( int r = 0; r < count1; r++ )

{

Array3D< double A(M,N,P);

for (int i=0; i < M; i++)

for (int j=0; j < N; j++)

for (int k=0; k < P; k++)

A[i][j][k] = (double)k; /* initalize array values */

for( int q = 0; q < count2; q++ )

{

double sum = 0.0;

for (int i=0; i < M; i++)

for (int j=0; j < N; j++)

for (int k=0; k < P; k++)

sum += A[i][j][k]; /* calc sum */

if( r == 0 && (q == 0 || q == 15) ) printf("Sum: %lf\n",sum);

}

}

printf("Array3D test Took %d seconds\n",(int)(time(NULL) - starttime));

starttime = time( NULL );

int T = M*M;

for( int r = 0; r < count1; r++ )

{

double *A = new double[M*N*P];

for (int i=0; i < M; i++)

for (int j=0; j < N; j++)

for (int k=0; k < P; k++)

A[(T*i)+(N*j)+k] = (double)k; /* initalize array values */

for( int q = 0; q < count2; q++ )

{

double sum = 0.0;

for (int i=0; i < M; i++)

for (int j=0; j < N; j++)

for (int k=0; k < P; k++)

sum += A[(T*i)+(N*j)+k]; /* calc sum */

if( r == 0 && (q == 0 || q == 15) ) printf("Sum: %lf\n",sum);

}

delete[] A;

}

printf("MyArray[] test Took %d seconds\n",(int)(time(NULL) - starttime));

starttime = time( NULL );

T = M*M;

int indexRoot1, indexRoot2;

for( int r = 0; r < count1; r++ )

{

double *A = new double[M*N*P];

for (int i=0; i < M; i++)

{

indexRoot1 = (T*i);

for (int j=0; j < N; j++)

{

indexRoot2 = indexRoot1 + (N*j);

for (int k=0; k < P; k++)

{

A[indexRoot2+k] = (double)k; /* initalize array values */

}

}

}

for( int q = 0; q < count2; q++ )

{

double sum = 0.0;

int indexRoot1, indexRoot2;

for (int i=0; i < M; i++)

{

indexRoot1 = (T*i);

for (int j=0; j < N; j++)

{

indexRoot2 = indexRoot1 + (N*j);

for (int k=0; k < P; k++)

{

sum += A[indexRoot2+k]; /* calc sum */

}

}

}

if( r == 0 && (q == 0 || q == 15) ) printf("Sum: %lf\n",sum);

}

delete[] A;

}

printf("MyArray[] (V2) test Took %d seconds\n",(int)(time(NULL) -

starttime));

starttime = time( NULL );

for( int r = 0; r < count1; r++ )

{

double *A = new double[M,N,P];

for (int i=0; i < M; i++)

for (int j=0; j < N; j++)

for (int k=0; k < P; k++)

A[i,j,k] = (double)k; /* initalize array values */

for( int q = 0; q < count2; q++ )

{

double sum = 0.0;

for (int i=0; i < M; i++)

for (int j=0; j < N; j++)

for (int k=0; k < P; k++)

sum += A[i,j,k]; /* calc sum */

if( r == 0 && (q == 0 || q == 15) ) printf("Sum: %lf\n",sum);

}

delete[] A;

}

printf("MyArray[,,] test Took %d seconds\n",(int)(time(NULL) - starttime));

return 0;

}