[英]VB.NET Memory Size of Dictionary?
我有一節課:
Class Test
Friend myDict As Dictionary(Of Byte, Byte) = New Dictionary(Of Byte, Byte)
Friend Test1 As Boolean
Friend Test2 As Boolean
Friend Test3 As Boolean
Friend Test4 As Boolean
Friend Test5 As Byte
Friend Test6 As Byte
Friend Test7 As Byte
Friend Test8 As Boolean
Public Sub New(smt As String)
Test1 = True
Test2 = True
Test3 = True
Test4 = True
Test5 = 51
Test6 = 58
Test7 = 0
Test8 = True
' ADDING 64 DICTIONARY ENTRIES HERE
myDict.Add(11, 0)
myDict.Add(21, 0)
myDict.Add(31, 0)
myDict.Add(41, 0)
myDict.Add(51, 0)
myDict.Add(61, 0)
myDict.Add(71, 0)
myDict.Add(81, 0)
myDict.Add(12, 0)
myDict.Add(22, 0)
myDict.Add(32, 0)
myDict.Add(42, 0)
myDict.Add(52, 0)
myDict.Add(62, 0)
myDict.Add(72, 0)
myDict.Add(82, 0)
myDict.Add(13, Nothing)
myDict.Add(23, Nothing)
myDict.Add(33, Nothing)
myDict.Add(43, Nothing)
myDict.Add(53, Nothing)
myDict.Add(63, Nothing)
myDict.Add(73, Nothing)
myDict.Add(83, Nothing)
myDict.Add(14, Nothing)
myDict.Add(24, Nothing)
myDict.Add(34, Nothing)
myDict.Add(44, Nothing)
myDict.Add(54, Nothing)
myDict.Add(64, Nothing)
myDict.Add(74, Nothing)
myDict.Add(84, Nothing)
myDict.Add(15, Nothing)
myDict.Add(25, Nothing)
myDict.Add(35, Nothing)
myDict.Add(45, Nothing)
myDict.Add(55, Nothing)
myDict.Add(65, Nothing)
myDict.Add(75, Nothing)
myDict.Add(85, Nothing)
myDict.Add(16, Nothing)
myDict.Add(26, Nothing)
myDict.Add(36, Nothing)
myDict.Add(46, Nothing)
myDict.Add(56, Nothing)
myDict.Add(66, Nothing)
myDict.Add(76, Nothing)
myDict.Add(86, Nothing)
myDict.Add(17, 0)
myDict.Add(27, 0)
myDict.Add(37, 0)
myDict.Add(47, 0)
myDict.Add(57, 0)
myDict.Add(67, 0)
myDict.Add(77, 0)
myDict.Add(87, 0)
myDict.Add(18, 0)
myDict.Add(28, 0)
myDict.Add(38, 0)
myDict.Add(48, 0)
myDict.Add(58, 0)
myDict.Add(68, 0)
myDict.Add(78, 0)
myDict.Add(88, 0)
Console.WriteLine("Created New!")
End Sub
Public Sub New()
End Sub
End Class
當我使用以下方法克隆此類的1.000.000時:
Public Clones As List(Of Test) = New List(Of Test)
Public Sub BenchmarkTest(cnt As Long)
Clones.Clear()
GC.Collect()
Dim t As Long = Now.Ticks
Dim tst As Test = New Test("")
For x As Long = 1 To cnt
Clones.Add(DeepCopy(tst))
Next
Console.WriteLine("Copied " + Clones .Count.ToString + " in " + ((Now.Ticks - t) / 10000).ToString + "ms (" + ((Now.Ticks - t) / 10000000).ToString + " secs)")
End Sub
Public Function DeepCopy(inputTest As Test) As Test
Dim other As Test = New Test()
other.Test1 = inputTest.Test1
other.Test2 = inputTest.Test2
other.Test3 = inputTest.Test3
other.Test4 = inputTest.Test4
other.Test5 = inputTest.Test5
other.Test6 = inputTest.Test6
other.myDict = New Dictionary(Of Byte, Byte)(inputTest.myDict)
Return other
End Function
我打開任務管理器,看看我的應用程序使用了多少內存,我發現它使用的是1,300 + Mb
好吧,根據我的計算,我的班級大小只能是136字節。 (64個字典條目(字節,字節)= 128bytes + 8bytes(對於test1到test8)= 136bytes)
將它與100萬相乘應該是大約130Mbytes,而不是1300Mbytes。
我的計算有什么問題? 為什么它使用了近10倍的內存?
你過度簡化了計算。 .NET對象帶來了必要的開銷,不能簡單地扁平化為逐字節等效。 (你的計算讓我想起了C風格的結構對齊。)
Test類中內存的主要“抓取器”將是Dictionary。 如果您逐步分析您的過程,您將看到簡單地實例化一個空字典將消耗內存。 當你開始添加項目時,事情變得更有趣。 當您添加項目時,.NET集合不會以線性方式增長,這樣效率太低。 該集合將通過一些內部定義的方案(有時是Fibonacci序列,有時是當前容量的簡單加倍)增長,其中添加足夠的項目將假設將添加另一個項目塊並保留該內存。
我知道這是理論上的,抽象的,高級別的討論,不會產生具體的答案,但我的意思是說這個問題非常復雜,對內存利用率的精確計算可能非常困難。
這是一篇不錯的Code Project文章 ,提到了Dictionaries中性能和內存使用的一些問題。
這是Simple-Talk的另一個有趣的鏈接 。 評論部分包含有關.NET集合增長策略的有趣討論。 請享用。
C#中的快速示例。 (這很臟,不要把它帶到銀行,但要證明這一點。 參見GC.GetTotalMemory )
Console.WriteLine("Bar is doing stuff.");
Console.WriteLine(GC.GetTotalMemory(true));
var dict = new Dictionary<byte, byte>();
Console.WriteLine(GC.GetTotalMemory(true));
dict.Add(8, 9);
Console.WriteLine(GC.GetTotalMemory(true));
輸出:
53,328 53,980 54,052
請注意,空字節/字節字典占用652個字節。 添加單個字節/字節條目會使字典大小增加72個字節...您沒有看到的一件事是每個條目實際上都是由DictionaryEntry類的實例在內部表示的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.