Làm cách nào để tìm dung lượng bộ nhớ thực tế cần thiết để lưu trữ giá trị của một số kiểu dữ liệu trong Haskell (chủ yếu là với GHC)? Có thể đánh giá nó trong thời gian chạy (ví dụ: trong GHCi) hoặc có thể ước tính yêu cầu bộ nhớ của một kiểu dữ liệu phức hợp từ các thành phần của nó không?
Nói chung, nếu yêu cầu bộ nhớ của các kiểu a
và b
được biết, thì chi phí bộ nhớ của các kiểu dữ liệu đại số là bao nhiêu, chẳng hạn như:
data Uno = Uno a
data Due = Due a b
Ví dụ, các giá trị này chiếm bao nhiêu byte trong bộ nhớ?
1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing
Tôi hiểu rằng phân bổ bộ nhớ thực tế cao hơn do thu thập rác bị trì hoãn. Nó có thể khác biệt đáng kể do lười đánh giá (và kích thước thunk không liên quan đến kích thước của giá trị). Câu hỏi đặt ra là, với một kiểu dữ liệu, giá trị của nó chiếm bao nhiêu bộ nhớ khi được đánh giá đầy đủ?
Tôi thấy có một :set +s
tùy chọn trong GHCi để xem thống kê bộ nhớ, nhưng không rõ làm thế nào để ước tính lượng bộ nhớ của một giá trị.