446,421 Members | 1,128 Online Need help? Post your question and get tips & solutions from a community of 446,421 IT Pros & Developers. It's quick & easy.

# Performance considerations in 3D arrays

 P: n/a 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 method for creating and accessing 2D, 3D and nD arrays? 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 #include #include #include #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; } Jul 9 '06 #1 