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 <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;
} 2 1268
Jon Rea wrote:
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!
>...
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));
double *A = new double[M,N,P]
is not the correct syntax to declare a three-dimensional array in C++.
In fact there is no way to define a three dimensional array whose
second and third dimensions are not known at compile time. In the case
of your particular program you can define M, N, P as 'const int' rather
than 'int' and define A as
double A[M][N][P];
and access the (i,j,k) element at A[i][j][k]
In C++ comma is a binary operator whose value equals that of the second
operand so double[M,N,P] is just the same as double[P] and A[i,j,k] is
the same as A[k]. The sum turns out right in your program because of
the special pattern you use for initializing A. Set its (i,j,k)th
element to something that depends of all the subscripts, say i*j*k, to
see the difference.
"jmoy" <jm**********@gmail.comwrote in message
news:11**********************@b28g2000cwb.googlegr oups.com...
Jon Rea wrote:
>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!
>>... 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));
double *A = new double[M,N,P]
is not the correct syntax to declare a three-dimensional array in C++.
In fact there is no way to define a three dimensional array whose
second and third dimensions are not known at compile time.
Well, not as such perhaps, but you can (inadvisedly) do:
double ***A = new double**[M];
for(int i=0; i<M; ++i)
{
A[i] = new double*[N];
for(int j=0; j<N; ++j)
{
A[i][j] = new double[P];
}
}
etc.
I wouldn't recommend it though (it's a bit on the long-winded side).
Stu
In the case
of your particular program you can define M, N, P as 'const int' rather
than 'int' and define A as
double A[M][N][P];
and access the (i,j,k) element at A[i][j][k]
In C++ comma is a binary operator whose value equals that of the second
operand so double[M,N,P] is just the same as double[P] and A[i,j,k] is
the same as A[k]. The sum turns out right in your program because of
the special pattern you use for initializing A. Set its (i,j,k)th
element to something that depends of all the subscripts, say i*j*k, to
see the difference.
This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Dave Theese |
last post by:
Hello all,
I'm in a poition of trying to justify use of the STL from a performance
perspective. As a starting point, can anyone cite any benchmarks comparing
vectors to plain old...
|
by: Gaurav |
last post by:
http://www.sys-con.com/story/print.cfm?storyid=45250
Any comments?
Thanks
Gaurav
|
by: Sebastian Werner |
last post by:
Howdy,
I currently develop the javascript toolkit qooxdoo
(http://qooxdoo.sourceforge.net), some of you heard it already.
We have discovered a slowdown on Internet Explorers performance when...
|
by: Mark Shelor |
last post by:
I've encountered a troublesome inconsistency in the C-language Perl
extension I've written for CPAN (Digest::SHA). The problem involves the
use of a static array within a performance-critical...
|
by: jortizclaver |
last post by:
Hi,
I'm about to develop a new framework for my corporative applications
and my first decision point is what kind of strings to use: std::string
or classical C char*.
Performance in my system...
|
by: ZenRhapsody |
last post by:
Has anyone done any performance testing between new generic Lists and single
dimensional arrays?
I really like the code flexibility the List provides since I don't know how
many items I will...
|
by: Martien van Wanrooij |
last post by:
I am working on some financial calculators and although I succeeded to
created the required formulas I am not sure about the following.To give an
example: when somebody puts a capital on the bank...
|
by: subramanian100in |
last post by:
This is not a homework assignment question.
Kindly excuse me for posting this question here.
Suppose a BST contains 100,000 ndoes.
Suppose I have to traverse the BST by Preorder, say, without...
|
by: atlaste |
last post by:
Hi,
I'm currently developing an application that uses a lot of
computational power, disk access and memory caching (to be more exact:
an information retrieval platform). In these kind of...
|
by: DolphinDB |
last post by:
Tired of spending countless mintues downsampling your data? Look no further!
In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
|
by: ryjfgjl |
last post by:
ExcelToDatabase: batch import excel into database automatically...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: PapaRatzi |
last post by:
Hello,
I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
|
by: CloudSolutions |
last post by:
Introduction:
For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
|
by: Defcon1945 |
last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
|
by: af34tf |
last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
|
by: Faith0G |
last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
| |