当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给我的表现力,但我从未想过表现方面。任何人都可以告诉我更多关于这一点(以及我可能不知道的任何其他隐藏成本)?
答案 0 :(得分:13)
我认为你已经确定了开销。对于每个存在限定变量,您需要相应的(指向)字典。这需要空间,更糟糕的是,方法调用将变得缓慢。您的示例中的(*)将是间接函数调用,而使用Double时,它将是原始操作。