IT박스

하스켈 데이터 타입의 메모리 풋 프린트

itboxs 2020. 7. 14. 20:57
반응형

하스켈 데이터 타입의 메모리 풋 프린트


Haskell (대부분 GHC 사용)에 일부 데이터 유형의 값을 저장하는 데 필요한 실제 메모리 양을 어떻게 찾을 수 있습니까? 런타임시 (예 : GHCi에서) 평가할 수 있습니까, 아니면 구성 요소에서 복합 데이터 유형의 메모리 요구 사항을 추정 할 수 있습니까?

일반적 유형의 메모리 요구하는 경우 ab공지 같은 대수 데이터 유형의 메모리 오버 헤드는 무엇인가

data Uno = Uno a
data Due = Due a b

예를 들어,이 값은 메모리에서 몇 바이트를 차지합니까?

1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing

가비지 수집이 지연되어 실제 메모리 할당이 더 높다는 것을 알고 있습니다. 지연 평가로 인해 크게 다를 수 있습니다 (썽크 크기는 값 크기와 관련이 없음). 문제는 데이터 유형이 주어지면 완전히 평가할 때 얼마나 많은 메모리를 사용합니까?

:set +sGHCi에는 메모리 통계를 볼 수 있는 옵션이 있지만 단일 값의 메모리 풋 프린트를 추정하는 방법은 명확하지 않습니다.


(다음은 GHC에 적용되며 다른 컴파일러는 다른 저장 규칙을 사용할 수 있습니다)

경험 법칙 : 생성자는 헤더에 한 단어를, 각 필드에 한 단어를 씁니다 . 예외 : (와 같은 어떤 필드 생성자 Nothing또는 TrueGHC 모든 용도의 사이에 이러한 생성자와 주를의 단일 인스턴스를 생성하기 때문에) 어떤 공간을 차지하지 않습니다.

워드는 32 비트 시스템에서 4 바이트, 64 비트 시스템에서 8 바이트입니다.

예를 들어

data Uno = Uno a
data Due = Due a b

Uno단어 2 개, Due3 개

Int타입으로 정의

data Int = I# Int#

이제 Int#한 단어가 필요하므로 Int총 2가 걸립니다. 대부분의 언 박싱 된 유형은 예외가되고, 하나의 말을 Int64#, Word64#그리고 Double#2 GHC 실제로 유형의 작은 값의 캐시가 가지고있는 (32 비트 시스템에서) Int하고 Char, 많은 경우에 이러한 전혀 힙 공간을 차지하지 않습니다. A는 String당신이 사용하지 않는 경우에만 목록 세포를위한 공간이 필요합니다 Char들 255>.

은와 Int8동일한 표현을 갖습니다 Int. Integer다음과 같이 정의됩니다.

data Integer
  = S# Int#                            -- small integers
  | J# Int# ByteArray#                 -- large integers

작은 Integer( S#)은 2 워드를 사용하지만 큰 정수는 값에 따라 가변적 인 공간을 차지합니다. A ByteArray#는 배열 자체에 2 워드 (헤더 + 크기)와 공백을 더한 값입니다.

Note that a constructor defined with newtype is free. newtype is purely a compile-time idea, and it takes up no space and costs no instructions at run time.

More details in The Layout of Heap Objects in the GHC Commentary.


The ghc-datasize package provides the recursiveSize function to calculate the size of a GHC object. However...

A garbage collection is performed before the size is calculated, because the garbage collector would make heap walks difficult.

...so it wouldn't be practical to call this often!

Also see How to find out GHC's memory representations of data types? and How can I determine size of a type in Haskell?.

참고URL : https://stackoverflow.com/questions/3254758/memory-footprint-of-haskell-data-types

반응형