Профиль Haskell без установки профилирующих библиотек для всех зависимостей
Я хочу профилировать мою программу, написанную на Haskell.
При компиляции мне говорят, что у меня не установлены библиотеки профилирования для определенных зависимостей (например, criterion
), и cabal
прерывается.
Я не заинтересован в профилировании частей этих зависимостей; код, вызываемый из main
, даже не использует их.
Как я могу профилировать свое приложение без установки ненужных мне библиотек профилирования и без удаления всех этих зависимостей?
Ответы
Ответ 1
Хороший способ обойти необходимость компилировать все с помощью профилирования - использовать песочницу cabal. Он позволяет вам настроить песочницу только для одного приложения, и вам не придется повторно устанавливать весь префикс ~/.cabal
. Вам понадобится последняя версия Cabal, поэтому сначала запустите cabal update && cabal install cabal-install
.
После инициализации песочницы создайте файл cabal.config
, чтобы включить необходимые директивы (в вашем случае library-profiling: True
; executable-profiling: True
также может быть удобно.)
Побочным эффектом этого является то, что вы можете протестировать свой код с зависимостями, которые не должны устанавливаться глобально, например, экспериментальные версии или устаревшие версии.
EDIT: btw, я не думаю, что для работы criterion
необходимо иметь профилирование. В любом случае, это работает для меня без возможности профилирования. Просто напишите модуль Main
, содержащий main = defaultMain benchmarks
, где benchmarks
имеет тип [Benchmark]
, то есть список тестов, которые вы написали.
Затем вы компилируете этот файл (скажем, называем его benchmarks.hs
ghc --make -o bench benchmarks.hs
) и запускаем программу ./bench
с соответствующими аргументами (подробнее см. в документации по критерию). Хорошим аргументом по умолчанию является, например, ./bench -o benchmarks.html
, который будет генерировать отличный отчет, подобный этот)
Ответ 2
У меня была та же проблема на этой неделе, и хотя я перекомпилировал все вручную, мне было поручено в IRC-канале сделать следующее:
- Перейдите в свой конфигурационный файл cabal (если вы не знаете, где)
- Отредактируйте строку для включения профилирования библиотеки (и пока вы на ней, включите документацию)
- Run Cabal Install World
Ответ 3
Как уже упоминалось в вопросе, на который вы ссылаетесь в своем комментарии, хорошим способом решения этой проблемы в будущем является включение профилирования в конфигурации Cabal. Таким образом, все библиотеки устанавливаются с поддержкой профилирования. Это может не быть удовлетворительным решением, но я думаю, что многие выбирают его.
Если вы заинтересованы только в том, чтобы получить представление об использовании памяти вашей программой, вы можете сгенерировать профиль кучи вашей программы, используя -hT
. Точнее, вы должны скомпилировать программу с помощью -rtsopts
чтобы включить опции RTS, а затем выполнить ее, используя +RTS -hT
. Компилятор генерирует файл с расширением hp
. Вы можете преобразовать файл hp
файл postscript с профилем кучи, используя hp2ps
. Это должно работать без какой-либо поддержки профилирования, но учтите, что мне лень это проверять, так как я установил все библиотеки с поддержкой профилирования; )