26 May 2013 08:15 PM |
|
Hi, guys:
I run the fellowing code and find the structure data is very slow with IDL 8.2.2. Please tell me why?
PRO struct_test
struct = {data:findgen(133,81,21)}
tic
FOR k=0, 20 DO BEGIN
FOR j=0, 80 DO BEGIN
FOR i=0, 132 DO BEGIN
void = sin(struct.data[i,j,k])
ENDFOR
ENDFOR
ENDFOR
toc
tic
data = struct.data
FOR k=0, 20 DO BEGIN
FOR j=0, 80 DO BEGIN
FOR i=0, 132 DO BEGIN
void = sin(data[i,j,k])
ENDFOR
ENDFOR
ENDFOR
toc
END
IDL> struct_test
% Compiled module: STRUCT_TEST.
% Time elapsed: 54.641000 seconds.
% Time elapsed: 0.016000032 seconds.
Dave
|
|
|
|
Deleted User New Member
Posts:  
09 Jun 2013 05:29 AM |
|
This problem is still there for IDL 8.2.3!
|
|
|
|
Deleted User New Member
Posts:  
09 Jun 2013 09:24 AM |
|
Here are my results, IDL 8.2.3 on Windows 64-bit.
IDL> struct_test
Elapsed Time: 0.215000
Elapsed Time: 0.048000
|
|
|
|
Deleted User New Member
Posts:  
10 Jun 2013 02:12 AM |
|
Hi, david:
I try the fellowing code, and find the "slow" expression.
PRO struct_test
struct = {data:findgen(133,81,21)}
tic
FOR k=0, 20 DO BEGIN
FOR j=0, 80 DO BEGIN
FOR i=0, 132 DO BEGIN
void = sin(struct.data[i,j,k])
ENDFOR
ENDFOR
ENDFOR
toc
tic
FOR k=0, 20 DO BEGIN
FOR j=0, 80 DO BEGIN
FOR i=0, 132 DO BEGIN
void = sin((struct.data)[i,j,k])
ENDFOR
ENDFOR
ENDFOR
toc
END
IDL> struct_test
% Compiled module: STRUCT_TEST.
% Time elapsed: 0.26500010 seconds.
% Time elapsed: 91.557000 seconds.
Dave
|
|
|
|
Deleted User New Member
Posts:  
10 Jun 2013 06:55 AM |
|
OK, this new Struct_Test program is much slower:
IDL> struct_test
Elapsed Time: 0.206000
Elapsed Time: 30.621000
But this doesn't surprise me. When you put parentheses around struct.data you are essentially saying "treat me as a variable passed by value, rather than by reference." In other words, to perform this operation [void = sin((struct.data)[i,j,k]))] you have to copy the data 133*81*21 times. That will be slow (and tedious!). It is simply the wrong way to write the program.
|
|
|
|
Deleted User New Member
Posts:  
18 Jun 2013 05:30 PM |
|
Very thanks for your explanation, David.
|
|
|
|