Làm cách nào để tìm số 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 với GHC)? Có thể đánh giá nó trong thời gian chạy (ví dụ: trong GHCi) hay có thể ước tính các yêu cầu bộ nhớ của một loại dữ liệu phức hợp từ các thành phần của nó?Dấu chân bộ nhớ của các kiểu dữ liệu Haskell
data Uno = Uno a
data Due = Due a b
Ví dụ, có bao nhiêu byte trong bộ nhớ làm những giá trị này chiếm:
Nói chung, nếu yêu cầu bộ nhớ của các loại a
và b
được biết, các chi phí bộ nhớ của các kiểu dữ liệu đại số như là những gì?
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 gom rác bị trì hoãn. Nó có thể khác biệt đáng kể do đánh giá lười biếng (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à, được đưa ra một kiểu dữ liệu, giá trị của nó mất bao nhiêu bộ nhớ khi được đánh giá đầy đủ?
Tôi thấy có một tùy chọn :set +s
trong GHCi để xem số liệu thống kê bộ nhớ, nhưng không rõ làm thế nào để ước tính dấu chân bộ nhớ của một giá trị duy nhất.
Cảm ơn bạn, Simon. Đây chính là điều tôi muốn biết. – sastanin
Không phải là tiêu đề hai từ? Một cho thẻ, và một cho con trỏ chuyển tiếp để sử dụng trong GC hoặc đánh giá? Vì vậy, nó sẽ không thêm một từ vào tổng số của bạn? –
Tỷ lệ thuận với giá trị của nó hoặc tỷ lệ thuận với logarit của chúng? – solidsnack