9

回答问题并提出使用 GADT 的建议时,评论中出现了一些关于性能的问题。这个问题涉及一个类型类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(每个“指针”?)都携带两个字典,这意味着 a[Input]在内存使用方面比使用(Just Double, Just Double)or 效率低得多,或者更好,(# #Double, #Double #)如果你存储value正常或未打包元组中的结果。

所以,虽然我喜欢 GADT 给我的表现力,但我从来没有过多地考虑过性能方面。谁能告诉我更多关于这一点(以及我可能不知道的任何其他隐藏成本)?

4

1 回答 1

13

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

于 2011-03-24T23:14:12.750 回答