Wie kann ich die tatsächliche Speichermenge ermitteln, die zum Speichern eines Werts eines Datentyps in Haskell erforderlich ist (hauptsächlich mit GHC)? Ist es möglich, es zur Laufzeit auszuwerten (z. B. in GHCi) oder ist es möglich, den Speicherbedarf eines zusammengesetzten Datentyps aus seinen Komponenten abzuschätzen?
Wenn Speicheranforderungen für Typen a
und b
bekannt sind, wie hoch ist im Allgemeinen der Speicheraufwand für algebraische Datentypen wie:
data Uno = Uno a
data Due = Due a b
Wie viele Bytes im Speicher belegen diese Werte beispielsweise?
1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing
Ich verstehe, dass die tatsächliche Speicherzuordnung aufgrund der verzögerten Speicherbereinigung höher ist. Aufgrund der verzögerten Bewertung kann dies erheblich abweichen (und die Thunk-Größe hängt nicht mit der Größe des Werts zusammen). Die Frage ist, wie viel Speicher bei einem Datentyp bei vollständiger Auswertung benötigt wird.
Ich habe festgestellt, dass es :set +s
in GHCi eine Option zum Anzeigen von Speicherstatistiken gibt, aber es ist nicht klar, wie der Speicherbedarf eines einzelnen Werts geschätzt werden soll.
Das Paket ghc-datasize bietet die Funktion recursiveSize zum Berechnen der Größe eines GHC-Objekts. Jedoch...
... also wäre es nicht praktisch, dies oft anzurufen!
Siehe auch Wie finde ich die Speicherdarstellungen von Datentypen bei GHC heraus? und Wie kann ich die Größe eines Typs in Haskell bestimmen? .
quelle