Haskellは実行時パフォーマンスの問題をデバッグするための多くの偉大なツールを持っていますが、どのようなツール/親指のルールはコンパイル時パフォーマンスの問題をデバッグするために存在しますか?デバッグGHCの制約に起因する時のパフォーマンスの問題をコンパイルソルバー
具体的には、私のコードの制約ソルバーは永遠に(1〜2秒から数分の間)です。これは制約の中で型のファミリをどのように使用しているかによると確信していますが、このコンテキストではどんな種類のものが高価なのか、制約ソルバーが時間を費やしているのかを見分けることはできません。私の最高の推測では、タイプリストに対する私の操作の1つは、線形の代わりに2次の時間を取っているということです。
制約ソルバーが疑わしい理由の例を見てみましょう。私のファイルでは、私はのようなコードがあります:私はGHCiのにこのファイルをロードすると
class ExampleClass a where
type ExampleType a
f :: ExampleType a -> a
data ExampleData (xs :: [a]) = ...
instance
(Constraint1
, Constraint2
, ...
) => ExampleClass (ExampleData xs)
where
type ExampleType (ExampleData xs) = Int
f = undefined
を
ghci> :l Example.hs
コンパイルが1秒よりもはるかに少ない、非常に迅速に起こります。 はその後、私は次の行を実行します。
ghci> let test = f Int :: ExampleData
をなし、実際の計算は起こっていないが、これはまだ非常に長い時間がかかります。 ExampleData
のインスタンス宣言の制約が増えるほど、時間がかかります。実際にテストを評価するのは即座に行われます。これらのパフォーマンスの問題をデバッグする方法を理解した最善の方法は、制約を1つずつコメントアウトし、パフォーマンスヒットの原因となっているものを確認することです。しかし、これは非常に時間がかかり、複雑なタイプのファミリが関与する場合、それほど有益ではありません。
この問題をデバッグするためのよりよいアプローチがありますか?
編集:発見したのはbug in GHCです。制約ソルバが線形でなければならない入力に対して二次的な時間を費やしていることを示すバグに関連するスクリプトがあります。
プロファイリングを有効にしてGHCをコンパイルしようとしたことがありますか? –
@BoydStephenSmithJr。私はGHCをコンパイルしたことはありません。この機能の使い方に関するチュートリアルはありますか? –
[Building GHC](http://ghc.haskell.org/trac/ghc/wiki/Building)はおそらく良いリソースであり、プロファイリングが含まれているかどうかはわかりませんが、GHCのベンチマークに関する節があります。 –