Come posso trovare la quantità effettiva di memoria richiesta per memorizzare un valore di un certo tipo di dati in Haskell (principalmente con GHC)? È possibile valutarlo in fase di esecuzione (ad esempio in GHCi) o è possibile stimare i requisiti di memoria di un tipo di dati composto dai suoi componenti?
In generale, se i requisiti di memoria dei tipi a
e b
sono noti, qual è il sovraccarico di memoria dei tipi di dati algebrici come:
data Uno = Uno a
data Due = Due a b
Ad esempio, quanti byte in memoria occupano questi valori?
1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing
Capisco che l'allocazione della memoria effettiva è maggiore a causa della raccolta dei rifiuti ritardata. Può essere notevolmente diverso a causa della valutazione lenta (e la dimensione thunk non è correlata alla dimensione del valore). La domanda è, dato un tipo di dati, quanta memoria occupa il suo valore quando viene valutato completamente?
Ho scoperto che esiste :set +s
un'opzione in GHCi per vedere le statistiche della memoria, ma non è chiaro come stimare l'impronta della memoria di un singolo valore.