存在量化类型的内存占用和相关的优化技术

时间:2013-11-26 12:07:25

标签: haskell memory optimization

考虑使用存在主义的以下数据模型:

data Node a = Node a (Map TypeRep AnyNode)
data AnyNode = forall a. Show a => AnyNode a

标准类型have been explained previously的内存占用规则。现在,存在类型的规则是什么,例如AnyNode

是否有任何优化技术,例如使用unsafeCoerce的一些变通方法可以避免存在性声明吗?我问这个是因为类似于Node的类型将被放置在高内存密集型lib的成本中心,所以内存占用就足够了,这就是为什么最脏的黑客是受欢迎的。

1 个答案:

答案 0 :(得分:15)

ghc-datasize包可能会有所帮助:

{-# LANGUAGE RankNTypes, GADTs #-}

import GHC.DataSize

data Node = forall a. Show a => Node a 

main = do
    s <- closureSize $ Node 0 
    print s -- 24 bytes on my 64-bit system

因此,与普通的一元数据构造函数相比,Node似乎需要一个额外的单词,大概是因为Show类字典指针。此外,我尝试向Node添加更多类约束,并且每个约束都需要一个额外的空格。

我不确定是否有可能在特定情况下魔法消除字典指针。如果你想保留存在主义类型,我认为这是不可能的。