2013-07-23 3 views
20

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です。制約ソルバが線形でなければならない入力に対して二次的な時間を費やしていることを示すバグに関連するスクリプトがあります。

+0

プロファイリングを有効にしてGHCをコンパイルしようとしたことがありますか? –

+0

@BoydStephenSmithJr。私はGHCをコンパイルしたことはありません。この機能の使い方に関するチュートリアルはありますか? –

+1

[Building GHC](http://ghc.haskell.org/trac/ghc/wiki/Building)はおそらく良いリソースであり、プロファイリングが含まれているかどうかはわかりませんが、GHCのベンチマークに関する節があります。 –

答えて

7

これは価値があるため、一度に1つずつ制約を評価することができます。kind!個別にコメントする必要はなく、どれくらい時間がかかるかを確認する必要があります。

関連する問題