Arrays 填充时,VB.NET对象数组速度减慢
我在VB.NET中遇到了一个问题。我有一个自定义对象ITNObject的数组,它有两个元素,一个sting和一个int 代码在一组XML文件上循环,读取节点,然后添加到主数组。目的是将数组输出到MySQL表 现在,重要的一点。当我在每个文件的每个循环末尾写入一次数组时,性能是线性的 但是,如果我为所有文件填充一个数组,并在最后写入一次,那么随着数组的填充,应用程序将逐渐变慢 最后,阵列中有数百万个对象 有什么建议吗?下面的代码显示了填充数组的部分,每个文件都会调用此代码。在本例中,它将填充整个文件集 速度明显减慢,每个文件开始时大约需要15毫秒,在数组中循环大约100000个ITN对象后,每个文件的速度将减慢到大约600毫秒 我怎样才能解决这个问题Arrays 填充时,VB.NET对象数组速度减慢,arrays,vb.net,performance,Arrays,Vb.net,Performance,我在VB.NET中遇到了一个问题。我有一个自定义对象ITNObject的数组,它有两个元素,一个sting和一个int 代码在一组XML文件上循环,读取节点,然后添加到主数组。目的是将数组输出到MySQL表 现在,重要的一点。当我在每个文件的每个循环末尾写入一次数组时,性能是线性的 但是,如果我为所有文件填充一个数组,并在最后写入一次,那么随着数组的填充,应用程序将逐渐变慢 最后,阵列中有数百万个对象 有什么建议吗?下面的代码显示了填充数组的部分,每个文件都会调用此代码。在本例中,它将填充整个文
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而不是数组?你每次加法都要重拨数组,难怪这需要线性时间。当然!这似乎做得很好。当然,非常感谢您抽出时间回答!这似乎做得很好。非常感谢您抽出时间回答。它有一个名字:它有一个名字: