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.