casacore
|
Fast 1D accessor/iterator for nD array classes. More...
Fast 1D accessor/iterator for nD array classes.
Public interface
Array and access, rather than Iterator, which would suggest more standard-like interfaces
Accessing a large multi-dimensional array by varying the indices of the array can be a slow process. Timing indications are that for a cube indexing with 3 indices was about seven times slower than using a standard 1D C-like index into an array of basic int types. Improvements have made this less, partly due to some pre-calculation necessary for this class, but can still be a factor of more than 3 slower. There are a variety of ways to access elements cube(i,j,k)
:
cube(i,j,k);
or cube(IPosition(3))
as described in the Array and Cube classes getStorage
for contiguous arrays. Ordered access along memory order can also be achieved by the use of the
getStorage()
method. For contiguous arrays this could be slightly faster than the use of the STLIterator
(about 10% faster), but slower for non-contiguous arrays. In addition it needs additional memory resources, which will lead to extra overhead. The general use of getStorage is discouraged with the introduction of the STLIterator. It should only be used when an interface to routines in other languages is needed (like Fortran), or when a large Array is known to be contiguous, and the data have to be referenced many times.
The ArrayAccessor class is an iterator like pointer to the data in the array. It is a 1-dimensional accessor. It is created with either a constant (at compile time) axis indicator, or with a run-time axis selector. ArrayAccessor constructor accepts a const Array<>
. However, the underlying Array class can be modified at this moment. In future a ConstArrayAccessor class is foreseen.
For run-time indices it would look like:
Compile-time and run-time axes can be mixed in constructors and assignments.
Tip: Like in all comparable situations, memory allocation within a loop can slow down processes; For that reason the example above can be better written (about 25% faster) as:
Tip: The underlying Array classes are structured with the first index varying fastest; This means that in general (due to caching and swapping) operations are fastest when Axis<0> >
is in the innermost loop (if possible of course);
The demonstrator and test programs have more examples.
The accessors can be dereferenced by the dereference operator (*
) and by the index operator ([int]
), which can handle negative values. Points around the accessor in any axis direction can be addressed along any axis by the templated methods next()
, prev()
and index(int)
. Either run-time or compile-time axes can be used (see example).
An accessor can be re-initialized with the init() function. It can also be reset() to any pointer value. Mthods end()
, begin()
, rbegin()
and rend()
are available for loop control (like in the STL iterators). In addition each of these can have an optional integer argument, specifying an offset (in points along the current axis).
Operations ++ – += -=
are available.
This class is available for Axis<n>
and AxisN
specializations only.
See the demonstrator program in aips/implement/Arrays/test/dArrayAccessor.cc
and the test program tArrayAccessor
for more examples.
To speed up especially interpolation code
Axis<n>
Definition at line 347 of file ArrayAccessor.h.