Оптимизация для доступа к массиву в lisp - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь научиться делать объявления типов в lisp. Я понял, что aref вызывает проблемы:

(defun getref (seq k)
  (declare (optimize (speed 3) (safety 0)))
  (declare (type (vector fixnum *) seq) (type fixnum k))
  (aref seq k))

Скомпилировано, это говорит:

; in: DEFUN GETREF
;     (AREF MORE-LISP::SEQ MORE-LISP::K)
; ==>
;   (SB-KERNEL:HAIRY-DATA-VECTOR-REF ARRAY SB-INT:INDEX)
; 
; note: unable to
;   avoid runtime dispatch on array element type
; due to type uncertainty:
;   The first argument is a (VECTOR FIXNUM), not a SIMPLE-ARRAY.
; 
; compilation unit finished
;   printed 1 note

И так в любой другой функции, где я хочу использовать aref (и я делаю, так как мне нужны регулируемые векторы), это тоже происходит. Как мне это исправить?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Это не проблема и не ошибка . Это просто информация ( note ) от компилятора SBCL, что он не может оптимизировать код лучше. Код будет работать просто отлично. Вы можете смело игнорировать это.

Если вы не можете использовать простой вектор (одномерный простой массив), то это цена за него: aref может быть немного медленнее.

0 голосов
/ 29 октября 2018

Подсказка по оптимизации, которую вы получаете, взята из строки документа deftransform, определенной в sbcl/src/compiler/generic/vm-tran.lisp:

(deftransform hairy-data-vector-ref ((array index) (simple-array t) *)
  "avoid runtime dispatch on array element type"
  ...)

У него есть комментарий, который говорит:

This and the corresponding -SET transform work equally well on non-simple
arrays, but after benchmarking (on x86), Nikodemus didn't find any cases
where it actually helped with non-simple arrays -- to the contrary, it
only made for bigger and up to 100% slower code.

Код для массивов довольно сложный, и трудно сказать, почему и как все устроено так, как они есть. Вам, вероятно, следует спросить разработчиков SBCL о sbcl-help. См. раздел рассылки в разделе SourceForge.

В настоящее время представляется предпочтительным использовать простые массивы, если это возможно.

...