X
PrevPrev Go to previous topic
NextNext Go to next topic
Last Post 18 Jun 2013 05:30 PM by  Deleted User
Structure data is very slow for IDL 8.2.2!
 5 Replies
Sort:
You are not authorized to post a reply.
Author Messages

anon



New Member


Posts:
New Member


--
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:
    New Member


    --
    09 Jun 2013 05:29 AM
    This problem is still there for IDL 8.2.3!

    Deleted User



    New Member


    Posts:
    New Member


    --
    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:
    New Member


    --
    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:
    New Member


    --
    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:
    New Member


    --
    18 Jun 2013 05:30 PM
    Very thanks for your explanation, David.
    You are not authorized to post a reply.