17

Haskell で書かれたプログラムのプロファイルを作成したいと考えています。

criterionコンパイル時に、特定の依存関係 (例: ) のプロファイリング ライブラリがインストールされておらず、cabal中止すると言われました。

これらの依存関係の一部をプロファイリングすることには興味がありません。から呼び出されたコードはmainそれらを使用しません。

不要なプロファイリング ライブラリをインストールせずに、またそれらの依存関係をすべて削除せずに、アプリケーションをプロファイリングするにはどうすればよいですか?

4

3 に答える 3

13

プロファイリングですべてをコンパイルする必要を回避する良い方法は、cabal サンドボックスを使用することです。1 つのアプリケーションに対してのみサンドボックスを設定できるため、~/.cabalプレフィックス全体を再インストールする必要はありません。最新バージョンの Cabal が必要なので、cabal update && cabal install cabal-install最初に実行してください。

サンドボックスを初期化したらcabal.config、必要なディレクティブを含むファイルを作成します (あなたの場合はlibrary-profiling: True;executable-profiling: Trueも便利かもしれません)。

これの副次的効果は、実験的なバージョンや古いバージョンなど、グローバルにインストールする必要のない依存関係を使用してコードをテストできることです。

編集:ところで、プロファイリングを有効にする必要はないと思いますcriterion。いずれにせよ、プロファイリングを有効にしなくても機能します。where has typeMainを含むモジュール、つまり、作成したベンチマークのリストを作成するだけです。main = defaultMain benchmarksbenchmarks[Benchmark]

次に、そのファイルをコンパイルします (たとえば、 で呼び出し、適切な引数を指定benchmarks.hsghc --make -o bench benchmarks.hsてプログラムを実行し./benchます (詳細については、基準のドキュメントを参照してください。適切なデフォルトの引数は、./bench -o benchmarks.htmlこれに似た気の利いたレポートを生成するというものです) 。

于 2012-08-31T09:22:00.137 に答える
8

今週も同じ問題が発生しました。すべてを手作業で再コンパイルしましたが、IRCチャネルで次のように指示されました。

  1. cabal構成ファイルに移動します(場所がわからない場合)
  2. ライブラリプロファイリングを有効にするための行を編集します(そして、その間にドキュメントを有効にします)
  3. CabalInstallWorldを実行する
于 2012-08-31T08:39:36.090 に答える
6

コメントで参照している質問で述べたように、将来この問題を解決する良い方法は、カバール構成でプロファイリングを有効にすることです。このようにして、すべてのライブラリがプロファイリングサポートとともにインストールされます。これは満足のいく解決策ではないかもしれませんが、多くの人がそれを選んでいると思います。

プログラムのメモリ使用量の印象を取得することにのみ関心がある場合は、を使用してプログラムのヒーププロファイルを生成できます-hT。より正確には、-rtsoptsRTSオプションを有効にするためにプログラムをコンパイルしてから、を使用して実行する必要があります+RTS -hT。コンパイラは、拡張子が。のファイルを生成しますhphpを使用して、ファイルをヒーププロファイルを持つポストスクリプトファイルに変換できますhp2ps。これはプロファイリングサポートなしで機能するはずですが、プロファイリングサポート付きのすべてのライブラリをインストールしたので、検証するのが面倒であることに注意してください。)。

于 2012-08-31T08:41:39.847 に答える