2011-03-24 12 views
9

answering a question with a suggestion to use GADTsの場合、パフォーマンスに関するいくつかの質問がコメントに表示されました。質問は型クラスPlotValue関与:GADTを使用した場合のパフォーマンスの影響

class PlotValue a where 
    value :: a -> Double 

をし、私の答えは、GADT Inputを使うことを提案:

data Input where 
    Input :: (PlotValue a, PlotValue b) => Maybe a -> Maybe b -> Input 

が、詳細には、私は考え、軽微です。

私は、パフォーマンスの二つの側面について思ったんだけど:

時間: を

case x of 
    Input (Just a) (Just b) -> value a * value b 
    _ -> 0.0 

を超えると2 Maybeに一致する通常のコスト上記のようなパターンマッチによって生じたいかなるランタイムコストがあります値?

スペース: タイプInputの値がどのくらいのストレージのオーバーヘッドを運ぶのですか?私の推測では、タイプInput(それぞれ 'ポインター'?)のそれぞれの値について、の2つの辞書があり、[Input]は、(Just Double, Just Double)を使用するよりもメモリ使用量がはるかに非効率的であるか、 (# #Double, #Double #) - valueの結果を通常のまたは展開されていないタプルに格納する場合。

私はGADTが私に与える表現力が大好きですが、パフォーマンスの側面についてはこれまで考えていませんでした。誰も私にこれについてもっと教えてもらえますか?

答えて

13

私はオーバーヘッドを釘付けにしたと思います。存在する修飾された変数ごとに、対応する(ポインターへの)辞書が必要です。これはスペースを必要とし、悪化すると、メソッド呼び出しが遅くなります。あなたの例の(*)は間接関数呼び出しですが、Doubleの場合はプリミティブなopになります。

+2

しかし、OOPと非最終クラスのオブジェクトについても同様のことが言えます(メソッドに渡された各オブジェクトには、仮想メソッドテーブルまたは同等のものへのポインタが必要です).C++またはJavaは、アプリケーション。もちろんこれらの両方の言語では、パフォーマンスのためにいくつかのもののために配列のような非オブジェクト指向のものを使用します。明らかなコメントですが、私はそれを視点に入れたいと思っていました。 –

+2

あなたの答えをありがとう、私の疑惑を確認してください! 'value'の結果が' Double'なので、 'Double - > Double - > Double'型で常に使われるように、case式の'(*) 'は私のようですが、' value'はすべての時間を評価し、(String型の解析のように)高価になる可能性があるので、ここでは普通のDouble型の方がはるかに優れています。 – yatima2975

関連する問題