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

  • My name is Festis and I'm free

    My name is F

    2 EKİM 2011
  • Glyn Dewis

    Glyn Dewis

    25 AĞUSTOS 2007
  • hans peder sahl

    hans peder s

    22 Temmuz 2009