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

Nik*_*kov 8 memory optimization haskell

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

data Node a = Node a (Map TypeRep AnyNode)
data AnyNode = forall a. Show a => AnyNode a
Run Code Online (Sandbox Code Playgroud)

先前已经解释了关于标准类型的存储器占用的规则.现在,存在类型的规则是什么,比如AnyNode

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

And*_*ács 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
Run Code Online (Sandbox Code Playgroud)

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

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

  • @NikitaVolkov:你可能也想在编译模式下捣乱,可能还有优化,因为与GHCi相比,尺寸有时会发生变化. (2认同)