Access to elements of foreign arrays, for getting or setting, can be very slow if they are not declared. These declarations can take several forms: declare, declaim, proclaim, or the. With the exception of the the form, these declarations will only be effective in SBCL and CCL. Users of other implementations that support the environment function variable-information should contact the Antik maintainer to have support added. If declarations are present and the compiler honors the compiler macros that foreign-array defines, the aref and related forms are macro-expanded directly into foreign array calls, considerably increasing the speed of execution.
When using matrices, declarations with explicit dimensions are also helpful for speed, e.g.
(declare (type (grid:matrix-double-float 100 100) my-matrix new-matrix))
For setting array elements, it is better to use the macro grid:gsetf than setf when declarations are present. It is hoped that eventually this macro can be eliminated.
For example, the declarations in the following function, and the use of grid:gsetf instead of setf, help decrease the execution time when running this function:
(defun foreign-array-test (dim)
(let ((input (grid:make-foreign-array
'double-float
:dimensions dim
:initial-element 1.0d0))
(output (grid:make-foreign-array 'double-float :dimensions dim)))
(declare (type grid:vector-double-float input output)) ; declaration of foreign arrays
(let ((tv0 0.0d0) (tv1 0.0d0))
(declare (type double-float tv0 tv1))
(iter (for i from 0 below dim)
(setf tv0 0.0d0)
(iter (for m from 0 to i)
(iter (for n from i below dim)
(setf tv1 0.0d0)
(iter (for k from m to n)
(incf tv1 (grid:aref input k)))
(incf tv0 (expt tv1 -2))))
(grid:gsetf (grid:aref* output i) (- (grid:aref input i) tv0))))))