Arrays 填充时,VB.NET对象数组速度减慢

Arrays 填充时,VB.NET对象数组速度减慢,arrays,vb.net,performance,Arrays,Vb.net,Performance,我在VB.NET中遇到了一个问题。我有一个自定义对象ITNObject的数组,它有两个元素,一个sting和一个int 代码在一组XML文件上循环,读取节点,然后添加到主数组。目的是将数组输出到MySQL表 现在,重要的一点。当我在每个文件的每个循环末尾写入一次数组时,性能是线性的 但是,如果我为所有文件填充一个数组,并在最后写入一次,那么随着数组的填充,应用程序将逐渐变慢 最后,阵列中有数百万个对象 有什么建议吗?下面的代码显示了填充数组的部分,每个文件都会调用此代码。在本例中,它将填充整个文

我在VB.NET中遇到了一个问题。我有一个自定义对象ITNObject的数组,它有两个元素,一个sting和一个int

代码在一组XML文件上循环,读取节点,然后添加到主数组。目的是将数组输出到MySQL表

现在,重要的一点。当我在每个文件的每个循环末尾写入一次数组时,性能是线性的

但是,如果我为所有文件填充一个数组,并在最后写入一次,那么随着数组的填充,应用程序将逐渐变慢

最后,阵列中有数百万个对象

有什么建议吗?下面的代码显示了填充数组的部分,每个文件都会调用此代码。在本例中,它将填充整个文件集

速度明显减慢,每个文件开始时大约需要15毫秒,在数组中循环大约100000个ITN对象后,每个文件的速度将减慢到大约600毫秒

我怎样才能解决这个问题

Public Sub ReadITN(filetoDecompress As String)

    Dim XDoc As Xml.XmlDocument
    XDoc = New Xml.XmlDocument
    XDoc.Load(filetoDecompress)
    Dim nsmgr = New XmlNamespaceManager(XDoc.NameTable)
    nsmgr.AddNamespace("os", "http://www.ordnancesurvey.co.uk/xml/namespaces/osgb")

    Dim i As Integer
    Dim RoadRank As Integer
    Dim toid() As String
    Dim x As Integer
    Dim descNode As XmlNode
    Dim xmlNodes As XmlNodeList = XDoc.SelectNodes("//os:RoadLink", nsmgr)
    Dim loopCount As Integer = 0
    For Each mxmlnode As XmlNode In xmlNodes 'XDoc.GetElementsByTagName("osgb:RoadLink")
        x = 0
        ReDim Preserve toid(x)

        For Each n As XmlNode In mxmlnode.SelectNodes(".//os:referenceToTopographicArea", nsmgr)
            'If n.Name = "osgb:referenceToTopographicArea" Then
            ReDim Preserve toid(x)
            toid(x) = Microsoft.VisualBasic.Right(n.Attributes.Item(0).Value, Len(n.Attributes.Item(0).Value) - 1)
            x = x + 1
            'End If
        Next n

        descNode = mxmlnode.SelectSingleNode(".//os:descriptiveTerm", nsmgr)

        RoadRank = 0
        Select Case UCase(descNode.InnerText)
            Case "MOTORWAY" : RoadRank = 1
            Case "A ROAD" : RoadRank = 2
            Case "B ROAD" : RoadRank = 3
            Case "MINOR ROAD" : RoadRank = 4
            Case "LOCAL STREET" : RoadRank = 5
            Case "PRIVATE ROAD" : RoadRank = 6
            Case "PRIVATE ROAD - RESTRICTED ACCESS" : RoadRank = 7
            Case "PRIVATE ROAD - PUBLICLY ACCESSIBLE" : RoadRank = 8
            Case "PEDESTRIANISED STREET" : RoadRank = 9
            Case "ALLEY" : RoadRank = 10
        End Select

        If toid(0) <> "" Then

            For i = 0 To x - 1
                ReDim Preserve ITNObjects(ITNCount)
                If ITNObjects(ITNCount) Is Nothing Then
                    ITNObjects(ITNCount) = New ITNObject()
                End If

                ITNObjects(ITNCount).Toid = toid(i)
                ITNObjects(ITNCount).RoadRank = RoadRank
                ITNCount = ITNCount + 1
            Next i
        End If
        Erase toid
    Next

    descNode = Nothing
    xmlNodes = Nothing
    XDoc = Nothing
    toid = Nothing
End Sub

使用列表而不是数组

在.NET中,不能调整数组的大小。ReDim Preserve命令创建一个新数组,并将所有项目从旧数组复制到新数组。阵列越大,这自然需要更长的时间

创建列表:

Dim ITNObjects as New List(Of ITNObject)
Dim temp as New ITNObject()
temp.Toid = toid(i)
temp.RoadRank = RoadRank
ITNObjects.Add(temp)
将项目添加到列表中:

Dim ITNObjects as New List(Of ITNObject)
Dim temp as New ITNObject()
temp.Toid = toid(i)
temp.RoadRank = RoadRank
ITNObjects.Add(temp)

使用列表而不是数组

在.NET中,不能调整数组的大小。ReDim Preserve命令创建一个新数组,并将所有项目从旧数组复制到新数组。阵列越大,这自然需要更长的时间

创建列表:

Dim ITNObjects as New List(Of ITNObject)
Dim temp as New ITNObject()
temp.Toid = toid(i)
temp.RoadRank = RoadRank
ITNObjects.Add(temp)
将项目添加到列表中:

Dim ITNObjects as New List(Of ITNObject)
Dim temp as New ITNObject()
temp.Toid = toid(i)
temp.RoadRank = RoadRank
ITNObjects.Add(temp)
您已经编写了一个关于^2算法的程序。每次向数组中添加新元素时,都会创建一个需要复制所有旧元素的新数组。正如您所发现的,在^2上,当n的值较大时,算法表现不佳

您可以使用所谓的指数退避分配策略来解决此问题。原理很简单,当数组满时,只需将其大小增加一倍。像这样:

 If toid.GetUpperBound(0) < x Then ReDim Preserve toid(2 * x)
这与.NET集合类使用的策略完全相同。与ListOf T一样,更好的数组类型

您已经编写了一个关于^2算法的程序。每次向数组中添加新元素时,都会创建一个需要复制所有旧元素的新数组。正如您所发现的,在^2上,当n的值较大时,算法表现不佳

您可以使用所谓的指数退避分配策略来解决此问题。原理很简单,当数组满时,只需将其大小增加一倍。像这样:

 If toid.GetUpperBound(0) < x Then ReDim Preserve toid(2 * x)

这与.NET集合类使用的策略完全相同。与ListOf T类似,更好的数组类型。

为什么不使用ListOf T而不是数组?每次加法都要重新命名数组,难怪要花费线性时间。为什么不使用ListOf T而不是数组?你每次加法都要重拨数组,难怪这需要线性时间。当然!这似乎做得很好。当然,非常感谢您抽出时间回答!这似乎做得很好。非常感谢您抽出时间回答。它有一个名字:它有一个名字: