使用GADT的性能影响

时间:2011-03-24 22:50:52

标签: performance haskell gadt

answering a question with a suggestion to use GADTs时,评论中出现了一些与绩效有关的问题。问题涉及类型类PlotValue

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

是否超出了匹配两个Maybe值的正常费用?

空格: 类型Input带有多少存储开销?我的猜测是,它为PlotValue类型的每一个值(每个都是一个“指针”)带有两个Input字典,这意味着[Input]在效率上要低得多内存使用条款比使用(Just Double, Just Double)或更好的(# #Double, #Double #) - 如果将value的结果存储在普通或未包装的元组中。

所以,虽然我喜欢GADT给我的表现力,但我从未想过表现方面。任何人都可以告诉我更多关于这一点(以及我可能不知道的任何其他隐藏成本)?

1 个答案:

答案 0 :(得分:13)

我认为你已经确定了开销。对于每个存在限定变量,您需要相应的(指向)字典。这需要空间,更糟糕的是,方法调用将变得缓慢。您的示例中的(*)将是间接函数调用,而使用Double时,它将是原始操作。