Comment puis-je trouver la quantité réelle de mémoire requise pour stocker une valeur d'un type de données dans Haskell (principalement avec GHC)? Est-il possible de l'évaluer à l'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
et b
sont connus, quelle est la surcharge mémoire des 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 de mémoire réelle est plus élevée en raison du retard du garbage collection. Il peut être significativement différent en raison de l'évaluation paresseuse (et la taille du thunk n'est pas liée à la taille de la valeur). La question est, étant donné un type de données, combien de mémoire prend sa valeur lorsqu'elle est entièrement évaluée?
J'ai trouvé qu'il existe une :set +s
option dans GHCi pour voir les statistiques de la mémoire, mais il n'est pas clair comment estimer l'empreinte mémoire d'une seule valeur.
Le package ghc-datasize fournit la fonction recursiveSize pour calculer la taille d'un objet GHC. Toutefois...
... il ne serait donc pas pratique d'appeler cela souvent!
Voir également Comment trouver les représentations mémoire de GHC des types de données? et Comment puis-je déterminer la taille d'un type dans Haskell? .
la source