Como posso encontrar a quantidade real de memória necessária para armazenar um valor de algum tipo de dados no Haskell (principalmente com GHC)? É possível avaliá-lo em tempo de execução (por exemplo, no GHCi) ou é possível estimar os requisitos de memória de um tipo de dados composto a partir de seus componentes?
Em geral, se os requisitos de memória dos tipos a
e b
são conhecidos, qual é a sobrecarga de memória dos tipos de dados algébricos, como:
data Uno = Uno a
data Due = Due a b
Por exemplo, quantos bytes na memória esses valores ocupam?
1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing
Eu entendo que a alocação de memória real é maior devido ao atraso na coleta de lixo. Pode ser significativamente diferente devido à avaliação lenta (e o tamanho da conversão não está relacionado ao tamanho do valor). A questão é, dado um tipo de dados, quanta memória seu valor leva quando totalmente avaliado?
Eu descobri que existe uma :set +s
opção no GHCi para ver estatísticas de memória, mas não está claro como estimar a área de cobertura de memória de um único valor.
fonte
O pacote ghc-datasize fornece a função recursiveSize para calcular o tamanho de um objeto GHC. Contudo...
... por isso não seria prático chamar isso com frequência!
Veja também Como descobrir as representações de memória dos tipos de dados do GHC? e Como posso determinar o tamanho de um tipo no Haskell? .
fonte