Использование профилировщика SBCL в моем собственном пакете

Я хочу профилировать некоторый код в моем пакете. Если я (require :sb-sprof) в REPL (по умолчанию CL-USER пакет), это работает. Однако, если я добавлю это в код внутри моего пакета, я получу Package SB-SPROF does not exist ошибка.

Если я поставлю (:import-from #:sb-sprof with-profiling) директива в моем defpackage, Это ведет к The name "SB-SPROF" does not designate any package,

Итак, как я могу включить профилирование?

1 ответ

Решение

Вам нужно оценить require прежде чем сделать defpackage вашего собственного пакета. defpackage не будет автоматически require SB-PROF модуль для вас. Думать о require как какая-то "фантазия" load, который загружает модуль в изображение. Во время загрузки пакеты модуля создаются, и только после этого вы можете ссылаться на них из defpackage или через ридер (sb-sprof:with-profiling).

Часто, когда мне лень делать все правильно (или если это "одноразовое" решение), я использую небольшой скрипт "loadup.lisp", который проверяет наличие всех моих зависимостей, а затем загружает мои собственный код Это также гарантирует, что изображение может быть надежно воспроизведено из свежего листа.

Нечто подобное

;; Make sure, the dependencies are present

(ql:quickload '(whatever))             ;; Load a dependency via Quicklisp
(require :sb-something-else)           ;; ... or via some implementation-dependent repository
(asdf:oos 'asdf:load-op 'some-module)  ;; ... or via ASDF or ... or ... or ...

;; Now, load my own stuff 

(load "packages")
(load "something-important-1")
...

Порядок этих операций важен; Вы не можете ссылаться на какие-либо пакеты из зависимых модулей в своих собственных объявлениях пакетов, пока эти модули не были загружены должным образом.

Другие вопросы по тегам