Профиль 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. Это должно работать без какой-либо поддержки профилирования, но учтите, что мне лень это проверять, так как я установил все библиотеки с поддержкой профилирования; )