Как я могу найти фактический объем памяти, необходимый для хранения значения некоторого типа данных в Haskell (в основном с GHC)? Можно ли оценить его во время выполнения (например, в GHCi) или можно оценить потребности в памяти для составного типа данных по его компонентам?
В общем, если требования к памяти типов a
и b
известны, каковы накладные расходы памяти для алгебраических типов данных, таких как:
data Uno = Uno a
data Due = Due a b
Например, сколько байтов в памяти занимают эти значения?
1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing
Я понимаю, что фактическое выделение памяти больше из-за отложенной сборки мусора. Он может значительно отличаться из-за ленивого вычисления (а размер преобразователя не связан с размером значения). Вопрос в том, учитывая тип данных, сколько памяти занимает его значение при полной оценке?
Я обнаружил, что :set +s
в GHCi есть опция для просмотра статистики памяти, но неясно, как оценить объем памяти для одного значения.
Пакет ghc-datasize предоставляет функцию recursiveSize для вычисления размера объекта GHC. Тем не мение...
... поэтому было бы непрактично звонить так часто!
Также см. Как узнать, как GHC представляет типы данных в памяти? и как я могу определить размер шрифта в Haskell? ,
источник