我的印象是List(Of T)是基本数组的实用程序包装器,但今天在测试时,我发现列表的内存大小是数组的两倍。这与我有关,因为我目前使用列表实现,数据库大约1.5gb,因为我没有包括其余的程序,所以我的口味有点太接近32位。如果我能把它削减一半,那就太棒了。
我使用列表来调整其大小,但我想我可以在数组周围构建自己的包装类,以便在较低的内存使用率下实现相同的功能。所以我做的测试是:
Public Class funnylist
Private arrlist As New List(Of Long())
Private rcount As Integer = 0
Private incsize As Integer = 1000
Private lastArr As Integer = -1
Private maxCount As Integer = 0
Private lastsub As Integer = -incsize
Public Sub add(n As Long)
If rcount = maxCount Then
arrlist.Add(New Long(incsize) {})
lastArr += 1
lastsub += incsize
maxCount += incsize
End If
arrlist(lastArr)(rcount - lastsub) = n
rcount += 1
End Sub
End Class
显然可以使用一些抛光但是作为概念证明它可以工作,相同数量的项目的内存占用量是列表(Long)的一半。问题是,我在列表和funnylist中填充了数字5的1000万计数并计时。列表的速度恰好是这两倍。所以我想知道列表的内容究竟发生了什么?为什么它更大,为什么它更快?有关改善我的funnylist的任何提示吗?
答案 0 :(得分:0)
如果您要在包装器中专门使用Long数组而不是List(Of Long),并且在添加新数字时动态调整大小,我有兴趣了解性能如何比较。试一试。将Long传递给构造函数以初始化包装器的内部数组,然后使用Add方法添加更多数字。您可以从MyArray属性中检索当前数组。
Public Class FunnyList
Private _myArray As Long()
Public Sub New(n As Long)
_myArray = New Long() {n}
End Sub
Public Sub Add(n As Long)
Dim iUBound As Integer = _myArray.GetUpperBound(0)
ReDim Preserve _myArray(iUBound + 1)
_myArray(iUBound + 1) = n
End Sub
Public ReadOnly Property MyArray() As Long()
Get
Return _myArray
End Get
End Property
End Class