Bagaimana saya dapat menemukan jumlah memori sebenarnya yang diperlukan untuk menyimpan nilai beberapa tipe data di Haskell (kebanyakan dengan GHC)? Apakah mungkin untuk mengevaluasinya pada saat runtime (misalnya dalam GHCi) atau mungkinkah untuk memperkirakan kebutuhan memori tipe data gabungan dari komponennya?
Secara umum, jika kebutuhan memori tipe a
dan b
diketahui, apa yang merupakan overhead memori tipe data aljabar seperti:
data Uno = Uno a
data Due = Due a b
Misalnya, berapa banyak byte dalam memori yang ditempati oleh nilai-nilai ini?
1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing
Saya memahami bahwa alokasi memori sebenarnya lebih tinggi karena pengumpulan sampah tertunda. Ini mungkin berbeda secara signifikan karena evaluasi malas (dan ukuran thunk tidak terkait dengan ukuran nilai). Pertanyaannya adalah, berdasarkan tipe data, berapa banyak memori yang dibutuhkan nilainya ketika dievaluasi sepenuhnya?
Saya menemukan ada :set +s
opsi di GHCi untuk melihat statistik memori, tetapi tidak jelas bagaimana memperkirakan jejak memori dari satu nilai.
Paket ghc-datasize menyediakan fungsi recursiveSize untuk menghitung ukuran objek GHC. Namun...
... jadi tidak praktis untuk menelepon sesering ini!
Lihat juga Bagaimana cara mengetahui representasi memori GHC dari tipe data? dan Bagaimana cara menentukan ukuran suatu tipe di Haskell? .
sumber