Ink

Contents related to tech, hobby, etc

stack 2.7.5でのProfilingの仕方メモ

|

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系になった際に変わったようで、 ドキュメントの更新コミットに説明とリンクがあります。