GDL is very very slow (compared to IDL) at accessing individual elements of a large structure array held within another structure.
I.e. this
for i=0,n-1 do m1=x.m(i)
Is drastically slower than
m=x.m & for i=0,n-1 do m1=m(i)
It is as if GDL copies the entire (sub)structure array before accessing the individual structure, rather than directly access the element itself.
Code to test this...
pro test_strarr_access
; make a big array of structures
m1={a:10}
n=50000l
m=replicate(m1,n)
; Time accessing each structure in turn
t0=systime(/jul)
for i=0,n-1 do m1=m(i)
t1=systime(/jul)
print,'Time to access m: '+string((t1-t0)*24*60*60)+'s'
; Time accessing each structure in turn when the array is inside another structure
x={m:m}
t0=systime(/jul)
for i=0,n-1 do m1=x.m(i)
t1=systime(/jul)
print,'Time to access m in structure: '+string((t1-t0)*24*60*60)+'s'
end
Output with IDL and GDL
GDL> test_strarr_access
Time to access m: 0.0053107738s
Time to access m in structure: 22.644134s
IDL> test_strarr_access
% Compiled module: TEST_STRARR_ACCESS.
Time to access m: 0.0037014484s
Time to access m in structure: 0.0088512897s
Note the behaviour of GDL is much better for a simple integer array - e.g. defining "m1=10" instead of "m1={a:10}". The issue seems specific to structure arrays.
GDL is very very slow (compared to IDL) at accessing individual elements of a large structure array held within another structure.
I.e. this
for i=0,n-1 do m1=x.m(i)
Is drastically slower than
m=x.m & for i=0,n-1 do m1=m(i)
It is as if GDL copies the entire (sub)structure array before accessing the individual structure, rather than directly access the element itself.
Code to test this...
Output with IDL and GDL
GDL> test_strarr_access
Time to access m: 0.0053107738s
Time to access m in structure: 22.644134s
IDL> test_strarr_access
% Compiled module: TEST_STRARR_ACCESS.
Time to access m: 0.0037014484s
Time to access m in structure: 0.0088512897s
Note the behaviour of GDL is much better for a simple integer array - e.g. defining "m1=10" instead of "m1={a:10}". The issue seems specific to structure arrays.