Comment trouver la quantité réelle de mémoire nécessaire pour stocker une valeur d'un certain type de données en Haskell (principalement avec GHC) ? Est-il possible de l'évaluer en cours d'exécution (par exemple dans GHCi) ou est-il possible d'estimer les besoins en mémoire d'un type de données composé à partir de ses composants ?
En général, si les besoins en mémoire des types a
y b
sont connus, quelle est la charge mémoire de types de données algébriques tels que
data Uno = Uno a
data Due = Due a b
Par exemple, combien d'octets en mémoire ces valeurs occupent-elles ?
1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing
Je comprends que l'allocation réelle de mémoire est plus élevée en raison du retard de la collecte des déchets. Elle peut être sensiblement différente en raison de l'évaluation paresseuse (et la taille du thunk n'est pas liée à la taille de la valeur). La question est la suivante : étant donné un type de données, quelle est la taille de sa valeur lorsqu'elle est entièrement évaluée ?
J'ai trouvé qu'il y a :set +s
dans GHCi pour voir les statistiques de mémoire, mais il n'est pas clair comment estimer l'empreinte mémoire d'une seule valeur.