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))))))