SORU
15 Temmuz 2010, PERŞEMBE


Haskell veri tiplerinin bellek ayak izi

Nasıl bellek miktarından Haskell bazı veri türü değeri saklamak için gerekli (çoğunlukla DZD) bulmak için? Çalışma zamanı (GHCi gibi) olarak değerlendirmek mümkün müdür ya da bu bileşenleri bileşik veri türü bellek gereksinimlerini tahmin etmek mümkün mü?

Eğer türleri a b bellek gereksinimleri olduğu bilinmektedir, genel olarak, ne gibi cebirsel veri türleri olarak bellek yükü

data Uno = Uno a
data Due = Due a b

Örneğin, kaç bayt bellekte bu değerler işgal?

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

Gerçek bellek ayırma gecikmeli çöp toplama nedeniyle daha yüksek olduğunu anlıyorum. Tembel Değerlendirme (ve thunk boyutu değer boyutu ile ilgili değil) nedeniyle önemli ölçüde farklı olabilir. Soru bir veri türü verilir, ne kadar değerini tam olarak değerlendirildiğinde sürer?

GHCi :set s seçenek hafıza istatistikleri görmek için orada buldum, ama tek bir değeri bellek ayak izi tahmin etmek için nasıl belli değil.

CEVAP
15 Temmuz 2010, PERŞEMBE


(Aşağıdaki DZD için geçerlidir, diğer Derleyiciler farklı depolama kuralları) kullanabilir

Temel kural:yapıcı bir başlık, ve her alan için bir kelime için bir kelime maliyetleri. İstisna: hayır alanlar (Nothing True gibi) DZD bu kurucular tek bir örneği ve hisse yaratır, çünkü alan alır, kullanır arasında bir kurucu.

Bir kelime 64-bit bir makinede 32-bit makine, ve bir 8 bayt 4 bayt.

Bu yüzden örneğin

data Uno = Uno a
data Due = Due a b

Uno 2 kelime alır ve Due 3 alır.

Int türü olarak tanımlanır

data Int = I# Int#

şimdi, Int# bir kelime alır, bu yüzden Int toplam 2 alır. Çoğu türleri bir sözüne, özel 2 al Int64#, Word64# Double# (32-bit makine üzerinde) olmak Kutusuz. DZD aslında 22 ** yazın ve Char birçok durumda bu hiç yığın alanı çok küçük değerler önbelleği vardır. String Chars ^ kullanmadığınız sürece tek liste hücreler için boşluk gerektirir . 255.

Int8 Int aynı temsil etti. Integer böyle tanımlanır:

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

çok küçük Integer (S#) 2 kelime alır, ama büyük bir tamsayı alanı değişken bir miktar değerine bağlı olarak alır. ByteArray# 2 kelime () başlık boyutu dizinin kendisi için yer artı alır.

Unutmayınbir kurucu newtype ile tanımlanan ücretsizdir. newtype tamamen derleme bir fikir olduğunu ve hiçbir boşluk alır ve zamanında hiçbir talimatları maliyetleri.

The Layout of Heap Objects in the GHC Commentary daha fazla bilgi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChannelRichard

    ChannelRicha

    7 Kasım 2008
  • Chaoticmoogle

    Chaoticmoogl

    13 ŞUBAT 2006
  • kalabrandmusic

    kalabrandmus

    25 Kasım 2009