哪个更快? someCondition具有相同的概率,因为它是假的。
插入:
arrayList = Array("apple", "pear","grape")
if someCondition then
' insert "banana" element
end if
删除:
arrayList = Array("apple","banana","pear","grape")
if not someCondition then
' remove "banana" element
end if
看起来它完全取决于Insert和Remove的实现。那么一般来说哪个更快?我倾向于插入,因为我已经读过可以使用CopyMemory插入而不循环。删除是否相同?有人有例子吗?
编辑: 这是VB6,而不是VB.NET。 出于显示原因,我必须使用insert而不是append。
答案 0 :(得分:1)
两者都具有相同的性能,因为两者都需要创建新的数组。阵列是固定尺寸的连续结构。
为了在插入上维护它,必须使用附加元素创建新的Array。所有现有值都将在其新位置复制到数组中,然后添加插入的元素。
为了保持删除,必须使用少一个元素创建一个新数组。然后,除删除之外的所有现有条目都必须复制到新数组中。
这两种操作在几乎相同的尺寸上具有基本相同的操作。表现不会有太大差异。
答案 1 :(得分:1)
对于删除,必须将删除项目后的每个项目向下移动。
对于插入,必须为新项找到空格。如果它可以附加的数组之后有空的空格,那么这就没有时间,并且新项目之后每个项目的唯一时间花费更多,以便在中间腾出空间。
如果本地没有可用空间,则必须分配一个全新的数组并复制每个项目。
因此,在考虑添加或删除相同的数组位置时,插入可能与删除一样快,但可能更长。插入不会更快。
答案 2 :(得分:0)
我找到了一个示例,表明可以在不循环的情况下删除。它看起来比插入的代码简单。
Public Sub RemoveArrayElement_Str(AryVar() As String, ByVal _
RemoveWhich As Long)
'// The size of the array elements
'// In the case of string arrays, they are
'// simply 32 bit pointers to BSTR's.
Dim byteLen As Byte
'// String pointers are 4 bytes
byteLen = 4
'// The copymemory operation is not necessary unless
'// we are working with an array element that is not
'// at the end of the array
If RemoveWhich < UBound(AryVar) Then
'// Copy the block of string pointers starting at
' the position after the
'// removed item back one spot.
CopyMemory ByVal VarPtr(AryVar(RemoveWhich)), ByVal _
VarPtr(AryVar(RemoveWhich + 1)), (byteLen) * _
(UBound(AryVar) - RemoveWhich)
End If
'// If we are removing the last array element
'// just deinitialize the array
'// otherwise chop the array down by one.
If UBound(AryVar) = LBound(AryVar) Then
Erase AryVar
Else
ReDim Preserve AryVar(UBound(AryVar) - 1)
End If
End Sub
答案 3 :(得分:0)
我必须猜测插入,因为它总是可以附加,而删除时你必须担心漏洞。
但什么版本的vb?如果您在.Net中并进行删除或插入,则根本不应使用数组。
答案 4 :(得分:0)
关于主题但不是一个答案:
插入和删除不是适用于阵列的应用程序。它超越了“优化”并进入了错误的编程。
如果这隐藏在呼叫结构的底部并且有人最终反复调用它,则可能会受到严重的性能影响。在一个案例中,我更改了一个数组插入排序,只需使用一个链表,它将运行时间从10 +小时(锁定机器)改为秒/分钟。
用ip地址填充列表框。在class-c地址空间设计和测试时,它运行良好,但是我们有要求在没有失败的情况下处理b类地址空间(可能需要一段时间,但不是几小时)。我们的任务是尽可能减少重构,以使其不失败。
不要假设你知道如何使用你的黑客。