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
(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
Char
s ^ 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.
.NET veri yapıları: ArrayList, her ne ...
Nasıl bellek mayın Tarlası mayın düzen...
Haskell'in Veri.Typeable?...
Konuları sadece 22 MB toplam bellek ku...
Ne kadar paylaşılan bellek vs mesaj ge...