stack 2.7.5でのProfilingの仕方メモ
Stackを用いたHaskellプロジェクトのプロファイリングについて、 色々な情報を試したけれどうまく行かなかったのでメモ。
上手くいった例と、ダメだった例とを掲載します。
プロファイリングの前提知識的なもの
時間とメモリ使用量(time and space)に関するプロファイリングのための機能は、 GHC自体が提供してくれています(公式ドキュメント)
このGHCが提供する機能は、コンパイル時と実行時にRSTオプションを切り替えることで 様々なプロファイルを取ることが出来ます。 コンパイルする際にプロファイリングを取れるようにコンパイルし、 実行時のオプションによって具体的な動作を決める感じですね。
詳しくは公式のドキュメントを参照してください。 (私もあまり詳しくないので)
ですが、 これはstackから直接使うことはできません(少なくとも、最善ではない) 。
stackのbuildコマンドには --ghc-options
というオプションがあるため
これに渡したくなるものですが、そうではなく他のフラグを使う必要があります。
上手くいった方法
stack build --profile
stack exec --profile -- <EXE_NAME> +RTS -p
ドキュメント: commercialhaskell/stack -- doc/GUIDE.md#debugging
どちらにも --profile
が必要そうです。
追記:
片方外したら動かなかったのですが、検証環境を綺麗に出来ていなかった 疑惑が出たため、もしかしたら片方でも動くかもしれません。
ダメだった方法
-ghc-options '-prof'
-prof
というのは、GHCにおいてプロファイリングの前提知識的なもので書いた
「GHCのプロファイリング機能」を使うためのフラグです。
素のGHCでプロファイリングをする際は、ビルド時に -prof
オプションが
必要だ、ということで愚直につけてみると怒られます。
(提示されたリンク先の内容も古いです)
$ stack build --ghc-options '-prof'
Error: When building with stack, you should not use the -prof GHC option
Instead, please use --library-profiling and --executable-profiling
See: https://github.com/commercialhaskell/stack/issues/1015
--profile
なし
stack clean
stack exec -- <EXE_NAME> +RTS -p
stackから見るように言われるcommercialhaskell/stack#1015では この方法で動いたとの記述があるが、動きませんでした。
これはどうやらstack 1系からstack 2系になった際に変わったようで、 ドキュメントの更新コミットに説明とリンクがあります。