¿Cómo puedo encontrar la cantidad real de memoria requerida para almacenar un valor de algún tipo de datos en Haskell (principalmente con GHC)? ¿Es posible evaluarlo en tiempo de ejecución (por ejemplo, en GHCi) o es posible estimar los requisitos de memoria de un tipo de datos compuesto a partir de sus componentes?
En general, si los requisitos de memoria de tipos a
y b
son conocidos, lo que es la sobrecarga de memoria de tipos de datos algebraicos tales como:
data Uno = Uno a
data Due = Due a b
Por ejemplo, ¿cuántos bytes en memoria ocupan estos valores?
1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing
Entiendo que la asignación de memoria real es mayor debido a la recolección de basura retrasada. Puede ser significativamente diferente debido a la evaluación diferida (y el tamaño del thunk no está relacionado con el tamaño del valor). La pregunta es, dado un tipo de datos, ¿cuánta memoria toma su valor cuando se evalúa por completo?
Descubrí que hay una :set +s
opción en GHCi para ver las estadísticas de memoria, pero no está claro cómo estimar la huella de memoria de un solo valor.
El paquete ghc-datasize proporciona la función recursiveSize para calcular el tamaño de un objeto GHC. Sin embargo...
... ¡así que no sería práctico llamar a esto a menudo!
Consulte también ¿Cómo encontrar las representaciones de memoria de tipos de datos de GHC? y ¿Cómo puedo determinar el tamaño de un tipo en Haskell? .
fuente