列表和数组大小的差异

时间:2014-05-11 02:49:26

标签: vb.net

我的印象是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的任何提示吗?

1 个答案:

答案 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