The IDL language has many features which allow for quick and
simple programming. For example, say you have an INT array and you need to
append a value to it:
intarray = [intarray,42]
Quick. Simple. However, just because you can do this
doesn't mean you should. Let's examine what is happening in the statement:
intarray = [intarray,42]
First, IDL has to create a temporary array to hold intarray
and the new value. Then, IDL copies intarray into the temporary and adds 42 to
the end of it. Finally, it has to free the old intarray variable. Creating a
temporary variable is an expensive operation. As such, you should always be
mindful when operations will create temporary variables. Take for example
creating an integer array of fixed length with some initial value using array
appending.
print, 'Creating array by appending'
tic
length=100000l
a=[]
for i=0l,length-1 do a=[a,42]
toc
Which completes in:
% Time elapsed: 1.4720001 seconds.
While the append functionality gives the flexibility to add
an element to an array, the time to create the temporary makes this approach
extremely impractical. However, if we need a dynamic array which elements and
be added and removed as needed, consider using LIST.
print, 'Creating array by list'
tic
length=100000l
l=list()
for i=0l, length-1 do l.add, 42
a=l.toarray()
toc
Which completes in:
% Time elapsed: 0.15200019 seconds.
LIST's avoid duplicating the entire array every time you add
an element. This is especially important when you are dealing with dynamic data.
However, if we know how long our array should be we can use IDL's array
creation functions to drastically increase performance.
print, 'Creating array by preallocate'
tic
length=100000l
a=intarr(length,/nozero)
for i=0l, length-1 do a[i]=42
toc
Which completes in:
% Time elapsed: 0.0060000420 seconds.
In this case we can speed up our processing even more.
Since we are initializing each element of our array to the same value, we can
improve our performance even more by using the MAKE_ARRAY function.
print, 'Creating array by vectorized solution'
tic
length=100000l
a=make_array(length,value=42)
toc
Which completes in:
% Time elapsed: 0.00000000 seconds.
There are many way to accomplish any given task in IDL.
However, each method has its unique advantages and disadvantages. By
understanding what you are trying to accomplish and what IDL has to do under
the hood to perform an operation, you can dramatically decrease the time it
takes your code to run.