【发布时间】:2015-05-15 11:38:08
【问题描述】:
我有一堂课:
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,而不是 1300。
我的计算有什么问题?为什么它使用了将近 10 倍的内存?
【问题讨论】:
-
你能用内存分析器代替任务管理器吗?任务管理器不可靠,见itwriting.com/dotnetmem.php
-
好的,我使用 .NET 内存分析器完成了它,是的,它准确地显示了任务管理器所说的......
标签: .net vb.net performance memory dictionary