Jak mogę znaleźć rzeczywistą ilość pamięci wymaganej do przechowywania wartości pewnego typu danych w Haskell (głównie z GHC)? Czy można to ocenić w czasie wykonywania (np. W GHCi), czy też można oszacować zapotrzebowanie na pamięć złożonego typu danych na podstawie jego komponentów?
Ogólnie rzecz biorąc, jeśli znane są wymagania dotyczące pamięci typów a
i b
, jaki jest narzut pamięci algebraicznych typów danych, takich jak:
data Uno = Uno a
data Due = Due a b
Na przykład, ile bajtów pamięci zajmują te wartości?
1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing
Rozumiem, że faktyczna alokacja pamięci jest wyższa z powodu opóźnionego czyszczenia pamięci. Może się znacznie różnić ze względu na leniwą ocenę (a wielkość pozycji nie jest związana z wielkością wartości). Pytanie brzmi, biorąc pod uwagę typ danych, ile pamięci zajmuje jego wartość po pełnej ocenie?
Znalazłem :set +s
opcję w GHCi, aby zobaczyć statystyki pamięci, ale nie jest jasne, jak oszacować ślad pamięci pojedynczej wartości.
Pakiet ghc-datasize udostępnia funkcję recursiveSize do obliczania rozmiaru obiektu GHC. Jednak...
... więc częste dzwonienie do tego nie byłoby praktyczne!
Zobacz także Jak znaleźć reprezentacje pamięci GHC dla typów danych? i jak mogę określić rozmiar czcionki w Haskell? .
źródło