2012-08-31 7 views
15

私はHaskellで書かれたプログラムをプロファイルしたいと思っています。Profile Haskellをインストールすることなく、すべての依存関係のプロファイリングライブラリをインストールする

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

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

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

+0

私はそれらをインストールするだけで問題は何ですか? –

+5

1)私はそれらを必要としません.2)それらをインストールすることは非常に面倒です:http://stackoverflow.com/questions/1704421/cabal-not-installing-dependencies-when-neededing-profiling-libraries – nh2

+3

私はそれが退屈であることに同意しますが、あなたがそれらを必要としないというあなたの主張は、明らかに偽です。 –

答えて

12

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

、必要な指示を含めるファイルcabal.configを作成します(あなたのケースlibrary-profiling: Trueには、executable-profiling: Trueも便利かもしれません。)

これの副作用は、あなたとあなたのコードをテストすることができるということです実験的なバージョンや古いバージョンなど、グローバルにインストールする必要はありません。

EDIT:btw、criterionを有効にするためにプロファイリングを有効にする必要はないと思います。いずれにしても、プロファイリングが有効になっていなくても動作します。ブロックを持っているmain = defaultMain benchmarksを含むMainモジュールを書くだけです。これは、あなたが書いたベンチマークのリストです。

その後、(たとえば、私たちは気の利いが生成されますどの./bench -o benchmarks.htmlを言って、適切なデフォルト引数がある。詳細については、基準のマニュアルを参照してください(ghc --make -o bench benchmarks.hsbenchmarks.hsそれを呼び出すと、適切な引数を使用してプログラム、./benchを実行し、そのファイルをコンパイルthis oneと似たレポート)

+0

'criterion'という名前は間違ったことを暗示していたと思います。それは私がプロファイルしたくない依存関係の単なる例です。 * "私のアプリケーションはテストのために' hunit'を使いますが、テストコードそのものをプロファイリングしたくないので、プロファイリングを有効にしてインストールすることは避けたいと思っています。 – nh2

+0

これは当分の間、時間を節約する回避策のようです。 – nh2

+0

基準は、時間的に2つの関数を比較したい場合にのみ有効です。なぜ*あなたのコードが遅い/速いのかについてはあまり教えてくれません。メモリリークや遅延Thunksを見つけるためには、 '-prof'スイッチが必要なヒーププロファイリングが必要です。 –

8

私は今週同じ問題を抱えていた、と私は手ですべてを再コンパイルしていたが、私は、次の操作を実行するためにIRCチャンネルに指示されました:あなたの秘密結社の設定ファイルへ

  1. ゴー(in case you don't know where)
  2. 編集あなたはを参照してください質問で述べたように、ライブラリのプロファイリングを有効にする(そして、あなたがそれでありながら、ドキュメントを有効にする)ためのライン
  3. 実行陰謀団は世界
6

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

プログラムのメモリ使用量を知りたい場合は、-hTを使用してプログラムのヒーププロファイルを生成できます。より正確に言えば、プログラムを-rtsoptsでコンパイルしてRTSオプションを有効にしてから、+RTS -hTを使用して実行する必要があります。コンパイラは、拡張子がhpのファイルを生成します。 hpファイルをhp2psを使用してヒーププロファイルを持つポストスクリプトファイルに変換することができます。これはプロファイリングのサポートがなくても動作するはずですが、プロファイリングサポートのあるすべてのライブラリがインストールされているので、それを確認するのは怠惰です。 )

+1

確認済みです。 –

+0

うわー、そうですよ!ヒーププロファイルは '-prof'を必要としないので、スペースプロファイリングだけが必要な場合は私の上記の問題は発生しません。ニース。 – nh2

+3

これは '-hT'の場合にのみ当てはまります。つまり、タイプベースのヒーププロファイリングです。リテイナプロファイリングのような '-prof'が必要な他のプロファイリングタイプもあります。 –

関連する問題